2015-11-02 12 views
3

Я пытаюсь отправить POST необработанный двоичный файл вместе с некоторыми другими данными, используя cURL. В принципе, я сделал это:Отправка сырого двоичного файла и данных с помощью 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() (например), так что это не физический файл на диске. Если я просто заменил CURL-файл, чтобы отправить данные двоичного файла с переменной «filedata», он просто не работает. Веб-служба не распознает файл. Возможно, есть способ создать CURL-файл, не указывая на настоящий файл.

+0

Ваш вопрос заключается в том, как отправлять данные, которые не являются реальным файлом на диске? – fico7489

+0

Мой вопрос заключается в том, как отправить ФАЙЛ, который не был сохранен на диске сервера (например, файл, полученный из базы данных или вывод ob_get_contents()), вместе с другими обычными почтовыми данными с использованием cURL. – greg

+0

По определению слова 'FILE' он хранится на диске в' папке', в противном случае это просто контент. Файловые и файловые системы - это всего лишь парадигмы о том, как хранятся данные, вы просто хотите отправить контент, который ничем не отличается от отправки строки имени пользователя. –

ответ

0

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

Так вобще

$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); 
+0

Спасибо за ответ, но он просто не работает. То, что я пытаюсь отправить, - это файл, а не только двоичный контент. Веб-служба продолжает отвечать «Требуемая часть запроса filedata» отсутствует ». Я также попытался вручную добавить заголовок «Content-Type: multipart/form-data» и установить параметры CURLOPT_HEADER, CURLOPT_HTTPHEADER, CURLOPT_INFILESIZE без каких-либо результатов. В моей первой реализации я создал CURLfile. Было бы здорово, если бы я мог создать тот же CURLfile, используя вывод ob_get_contents() вместо обращения к реальному файлу на диске. Но я не думаю, что это можно сделать так. – greg

+0

Но что вы определяете в качестве файла, вы сказали, что контент может поступать из файла, но вы не хотите отправлять его в виде файла? Итак, в основном, что вы пытаетесь сделать, это сохранить файл в переменной и отправить его? (нет?), я предлагаю вам не отправлять 'filename' и' filedata', а просто содержимое как обычную переменную POST. –

+0

Ok позволяет сделать это простым. Мне нужно отправить в веб-службу данные в переменной '$ data_upload'. Если я заменил CURL-файл на вывод 'ob_get_contents()', веб-служба ответит с ответом «400», «error»: «Bad Request» «Required request part 'filedata' не присутствует." '. Возможно, мне нужно добавить опцию curl_setopt, которую я не знаю. Мне нужна помощь в этом. Решение, которое вы предложили, к сожалению, не работает. – greg

0

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