Отправка необработанных двоичных файлов и данных с помощью cURL

Я пытаюсь отправить в POST необработанный двоичный файл вместе с некоторыми другими данными, используя cURL. В общем, я сделал так:

//Here i create the CURLFile
$cfile = new CURLFile($fullpath,'application/xml', $filename); 

//Data to upload (including the file)
$data_upload = array('username' => $username, 
                     'password' => $password, 
                     'owner' => $owner, 
                     'destination' => $pathpda, 
                     'filename' => $filename, 
                     'filedata' => $cfile);
//Upload
$ch_upload = curl_init($urlws.$e_upload);
curl_setopt($ch_upload, CURLOPT_POST,true);
curl_setopt($ch_upload, CURLOPT_POSTFIELDS, $data_upload);
curl_setopt($ch_upload, CURLOPT_RETURNTRANSFER, true);
$response_upload = curl_exec($ch_upload);
curl_close($ch_upload); 

Все работало нормально. За исключением того, что теперь я хочу, чтобы мой файл был просто двоичными данными, а не реальным файлом на диске. Кроме того, мне нужно отправить другие данные в запросе! Кто-нибудь знает, как это сделать? Я искал в Google, но не смог найти способ сделать и то, и другое, отправив необработанный двоичный файл и другие данные. Спасибо!

ОБНОВЛЕНИЕ Чтобы уточнить мой вопрос, мне не нужно просто отправлять случайные двоичные данные, а файл, содержимое которого поступает из ob_get_contents() (например), поэтому это не физический файл на диске. Если я просто заменю CURLfile для отправки данных двоичного файла переменной «filedata», это просто не сработает. Веб-служба не распознает файл. Возможно, есть способ создать CURLfile, не указывая на реальный файл.


person greg    schedule 02.11.2015    source источник
comment
ваш вопрос в том, как отправить данные, которые не являются реальным файлом на диске?   -  person fico7489    schedule 02.11.2015
comment
Мой вопрос заключается в том, как отправить ФАЙЛ, который не был сохранен на диске сервера (например, файл, извлеченный из базы данных, или вывод ob_get_contents()) вместе с другими обычными почтовыми данными с использованием cURL.   -  person greg    schedule 04.11.2015
comment
По определению слова FILE он хранится на диске в виде folder, иначе это просто содержимое. Файлы и файловые системы - это просто парадигмы того, как хранятся данные, вы просто хотите отправить контент, который ничем не отличается от отправки строки имени пользователя.   -  person Bas van Stein    schedule 04.11.2015
comment
@BasvanStein - ты не знаешь, о чем говоришь.   -  person Anthony    schedule 16.02.2018


Ответы (2)


Точно так же, как и с другими переменными. В конце концов все отправляется как "бинарное" или фактически в строковом представлении.

Так что просто сделай

$content = ob_get_contents();
//or file_get_contents() or whatever source
$data_upload = array('username' => $username, 
                 'password' => $password, 
                 'owner' => $owner, 
                 'destination' => $pathpda, 
                 'filename' => $filename, 
                 'filedata' => $cfile,
                 'allkindsofdata' => $content );
person Bas van Stein    schedule 03.11.2015
comment
Спасибо за ответ, но он просто не работает. Я пытаюсь отправить файл, а не просто двоичный контент. Веб-служба продолжает отвечать. Требуемая часть запроса «файловые данные» отсутствует. Я также пытался вручную добавить заголовок Content-Type:multipart/form-data и установить параметры CURLOPT_HEADER, CURLOPT_HTTPHEADER, CURLOPT_INFILESIZE без каких-либо результатов. В моей первой реализации я создал CURLfile. Было бы здорово, если бы я мог создать тот же CURLfile, используя вывод ob_get_contents() вместо того, чтобы обращаться к реальному файлу на диске. Но я не думаю, что это можно сделать таким образом. - person greg; 04.11.2015
comment
Но что вы определяете как файл, вы сказали, что содержимое может исходить из файла, но вы не хотите отправлять его как файл, верно? Итак, в основном вы пытаетесь сохранить файл в переменной и отправить его? (нет?), я предлагаю вам не отправлять filename и filedata, а только содержимое как обычную переменную POST. - person Bas van Stein; 04.11.2015
comment
Хорошо, давайте сделаем это просто. Мне нужно отправить в веб-службу данные в переменной $data_upload. Если я заменю CURLfile выводом ob_get_contents(), веб-сервис ответит исключением 400,"error":"Bad Request" "Required request part 'filedata' is not present.". Может быть, мне нужно добавить опцию в curl_setopt, которую я не знаю. Мне нужна помощь с этим. Решение, которое вы предложили, к сожалению, не работает. - person greg; 04.11.2015

Хитрость заключается в том, чтобы превратить вашу двоичную строку в поток в памяти, а затем сообщить curl для загрузки этого потока, используя: CURLOPT_INFILE, CURLOPT_INFILESIZE и CURLOPT_UPLOAD. Этот ответ содержит код для этого.

person gbe    schedule 11.12.2015