yaverm
@yaverm

Как отправить PDF файл по API?

Как отправить данные формы по API с прикрепленным файлом PDF при клике ? Мне нужно отправить Base64 binary по API для того чтоб с другого хоста можно было скачать. Для этого я с JS собираю данные, отправляю в обработку PHP.

<form enctype="multipart/form-data" id="userForm" name="userForm">
  <input type="text" name="FirstName" id="FirstName">
  <input type="text" name="LastName" id="LastName">
  <input type="email" name="Email" id="Email">
  <input type="file" name="file" id="file" multiple accept="application/pdf" >
  <button class="send" id="send-data">Send</button>
</form>


Тут с помощью JS собираю все данные формы.

jQuery(document).ready(function($){

		$('#send-data').on('click', function(e){

			e.preventDefault();			

			var formData = new FormData($(this).parents('form')[0]);
			formData.append('action', 'soap_post');

			$.ajax({
				url: '<?php echo admin_url("admin-ajax.php") ?>',
				type: 'POST', 
				data: formData,
				contentType: false,
				processData: false,
				success: function( data ) {	
					console.log( data );
				}
			});

		});

	});


Тут я сохраняю файл в нужном директиве.

Вопрос : Можно ли не сохранят файл а сразу же конвертировать данные внутри $_FILE и отправить ? или нужно файл с директории конвертировать и после отправки удалить с директории ? Тут запутался) можете разъяснить логику как все это правильно работает ?

add_action("wp_ajax_soap_post", "soap_post");
add_action("wp_ajax_nopriv_soap_post", "soap_post");

function soap_post() {

    $firstName = $_POST['FirstName'];
    $lastName = $_POST['LastName'];
    $email = $_POST['EmailAddress'];

    $arr_img_ext = array('application/pdf', 'image/png', 'image/jpeg', 'image/jpg', 'image/gif');
 
    for($i = 0; $i < count($_FILES['application']['name']); $i++) {
 
        if (in_array($_FILES['application']['type'][$i], $arr_img_ext)) {
 
            $upload = wp_upload_bits($_FILES['application']['name'][$i], null, file_get_contents($_FILES['application']['tmp_name'][$i]));
        }
    }

    $soapUrl = 'https://url.com/api';

    $headers = array(
        "Content-type: text/xml",
        "HOST: host.com.test",
        "Cache-Control: no-cache",
    );

    $xml_post_string = '<?xml version = "1.0" encoding = "utf-8"?>
                        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <soap:Body>
                        <Application xmlns="http://www.testhost.ch">
                            <item>
                                <FirstName>'.$firstName.'</FirstName>
                                <LastName>'.$lastName.'</LastName>
                                <EmailAddress>'.$email.'</EmailAddress>
                                <File>// Base64 binary</File>
                            </item>
                        </Application >
                        </soap:Body>
                        </soap:Envelope>';
 
                    $ch = curl_init($soapUrl);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
                    curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_post_string");
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    $output = curl_exec($ch);
                    curl_close($ch);

    die();
}
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
@alexalexes
Обрабатывать пришедшие данные налету или перезаписывать в файлы?
Зависит от того, хватает ли выделенной оперативной памяти PHP скрипту если попытаться сформировать тело $xml_post_string с бинарником. Если размер файлов, перекодированных в base64 в большинстве случаев заведомо меньше чем возможности ОЗУ скрипта, то смело можете налету обрабатывать.
Если нет, то принимаете все меры предосторожности, чтобы скрипт не хапнул лишних данных, вызывая переполнение выделенной ОЗУ, (если такая ситуация случится, то скрипт умрет молча, не выдав исключение). Записываете временный файл из $_FILES, порционно формируете другой временный файл с форматом $xml_post_string. Потом присоединяете данные этого файла к curl и отправляете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
от 130 000 до 180 000 ₽
Сбер Москва
До 240 000 ₽
25 окт. 2020, в 17:30
39999 руб./за проект
25 окт. 2020, в 17:16
150000 руб./за проект
25 окт. 2020, в 17:09
19999 руб./за проект