Я должен отправить файл на сервер вместе с несколькими параметрами post. Документация, которую я получил от этого администратора сервера, показывает пример того, как должен выглядеть почтовый запрос ( * ПРИМЕЧАНИЕ, пользовательский тип контента для POST «multipart / x-api-remote-integration»):
POST /gateway/remote_send HTTP/1.0 Content-Type: multipart/x-api-remote-integration; boundary=ABC1234 Content-Length: 323 --ABC1234 Content-Type: application/x-www-form-urlencoded profile_name=username&profile_pw=password1234&attached_type=action_1 --ABC1234 Content-Type: text/csv Content-Disposition: attachment; filename="attachment.csv" row1 row2 row3 --ABC1234--
Ниже приведен код php:
<?php function post(){ $base_api_url = "https://hostserver.com/gateway/remote_send"; $filename = realpath("/home/username/tests/test1234qwerty.csv"); $payload['profile_name'] = "username"; $payload['profile_pw'] = 'password1234'; $payload['attached_type'] = 'action_1'; $payload['filename'] = "@" . $filename . ";type=text/csv;"; $curl_options = array( CURLOPT_URL => $base_api_url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query( $payload ), CURLOPT_HTTP_VERSION => 1.0, CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => true, CURLOPT_HEADER => false, ); $curl = curl_init(); curl_setopt_array( $curl, $curl_options ); $result = curl_exec( $curl ); curl_close ($curl); echo $result; } post();
Из того, что я получаю с сервера, кажется, что почтовые поля получаются должным образом. Однако это файл, который не получен. Я не уверен, что я сделал не так. Любой вход очень приветствуется.
EDIT: Прикрепление подробного ответа:
* About to connect() to hostserver.com port 443 (#0) * Trying xxxx.. * connected * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * SSL connection using DHE-RSA-AES256-SHA * ******** REDACTED ************ * SSL certificate verify ok. > POST /gateway/remote_send HTTP/1.0 Host: hostserver.com Accept: */* Content-Length: 110 Content-Type: application/x-api-remote-integration * upload completely sent off: 110out of 110 bytes < HTTP/1.1 200 OK < Date: Mon, 19 Aug 2013 16:00:38 GMT < Server: Apache/2.2.15 (Red Hat) < Pragma: no-cache < CacheControl: no-cache < Cache-Control: no-cache < Expires: -1 < Connection: close < Content-Type: multipart/x-api-remote-integration; boundary=remote_send-52124126 < * Closing connection #0 HTTP/1.1 200 OK Date: Mon, 19 Aug 2013 16:00:38 GMT Server: Apache/2.2.15 (Red Hat) Pragma: no-cache CacheControl: no-cache Cache-Control: no-cache Expires: -1 Connection: close Content-Type: multipart/x-vcg-remote-api; boundary=remote_send-52124126 --remote_send-52124126 Content-Type: application/x-www-form-urlencoded result=invalid_filename --remote_send-52124126--
Я знаю, что имя пользователя и данные pw корректно считываются сервером, поскольку я тестировал их с ошибочной информацией и получал ошибку с учетными данными.
Когда вы указываете cURL на загрузку файла, заголовок Content-Type
автоматически устанавливается в multipart/form-data
. Для запроса, как в вашей документации, вы должны загрузить файл вручную.
<?php $url = 'https://hostserver.com/gateway/remote_send'; $payload = array( 'profile_name' => 'username', 'profile_pw' => 'password1234', 'attached_type' => 'action_1' ); $file = realpath('/home/username/tests/test1234qwerty.csv'); // build multipart $payload = http_build_query($payload); $params = "--ABC1234\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n" . "\r\n" . $payload . "\r\n" . "--ABC1234\r\n" . "Content-Type: text/csv\r\n" . "Content-Disposition: attachment; filename=\"attachment.csv\"\r\n" . "\r\n" . file_get_contents($file) . "\r\n" . "--ABC1234--"; $first_newline = strpos($params, "\r\n"); $multipart_boundary = substr($params, 2, $first_newline - 2); $request_headers = array(); $request_headers[] = 'Content-Length: ' . strlen($params); $request_headers[] = 'Content-Type: multipart/x-api-remote-integration; boundary=' . $multipart_boundary; // send the request now $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); $reply = curl_exec($ch);
Это работает?