POSTING multipart / form-data без вмешательства пользователя в PHP - PullRequest
0 голосов
/ 26 февраля 2011

Мне нужно отправить некоторые данные XML на удаленный сервер для обработки. Протокол сервера уже определен и неизменен. Данные XML, которые я хочу опубликовать, динамически генерируются на странице PHP, работающей на локальном сервере. Я не хочу, чтобы пользователю приходилось сохранять эти XML-данные в файл, а затем искать файл, чтобы загрузить его на удаленный сервер (это было бы неудобно для пользователя и бессмысленно). Мой вопрос заключается в том, как сделать это, используя функции PHP (это можно было бы сделать, закодировав HTML-форму с полем 'input file =', но это означает, что пользователь должен найти файл). Мне дали пример, и мне нужно написать PHP-код, который будет точно воспроизводить заголовки в примере и отправлять его на удаленный сервер. Любые подсказки, чтобы помочь мне?

POST http://doi.crossref.org/servlet/deposit?  operation=doMDUpload&login_id=USER&login_passwd=PSWD&area=live HTTP/1.1 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* 
Accept-Language: en-us Content-Type: multipart/form-data; boundary=---------------------------7d22911b10028e 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461) 
Host: Myhost 
Content-length: 1304 Pragma: no-cache -----------------------------7d22911b10028e 
Content-Disposition: form-data; name="fname"; filename="crossref_query.xml" 
<?xml version="1.0" encoding="UTF-8"?> 

.....XML data....

-----------------------------7d22911b10028e--

Вещи, которые я пытался безуспешно: форма и поле ввода = скрытое для данных XML (данные POSTed не содержат имени файла и поэтому отклоняются удаленным сервером); http_post_data () - только что выдал внутреннюю ошибку сервера на удаленном сервере; Кодирование потока данных вручную и отправка его через сокет порта 80 после использования fopensocket - сервер не распознал, что поток содержал данные формы POST, даже после проверки отправленного мною символа за символом с помощью tcpdump Итак, как вы можете сказать, я впадаю в отчаяние!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2011

Итак, вы говорите, что у пользователя открыто окно браузера, и у него есть доступ к XML-файлу с локального сервера (который, как я полагаю, их браузер может получить через http), и вы хотите, чтобы браузер действовал как туннель для передачи содержимого этого файла XML на ваш удаленный сервер? А у удаленного сервера нет доступа к этому локальному XML-файлу?

Проблемы безопасности делают это почти невозможным. (Вы не хотели бы, чтобы Yahoo вытаскивал случайные файлы из локальной сети во время просмотра, верно?)

Это может быть сделано, только если у вас есть некоторый контроль над тем, как локальный сервер предоставляет XML. В этом случае вы можете использовать JSONP, чтобы обойти проблемы безопасности и позволить странице в браузере отправлять данные на удаленный сервер в виде сообщения AJAX.

0 голосов
/ 26 февраля 2011

отсюда ...

 $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
    curl_setopt($ch, CURLOPT_URL, _VIRUS_SCAN_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    // same as <input type="file" name="file_box">
    $post = array(
        "file_box"=>"@/path/to/myfile.jpg",
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    $response = curl_exec($ch);
...