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

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

Войти через центр авторизации
Похожие вопросы