PHP Curl post with file attachment; custom content type header

I need to send a file to the server along with several post parameters. The documentation I received from this server administrator shows an example of what the mail request should look like (* NOTE the type of custom content for POST is "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-- 

Below is the php code:

 <?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(); 

From what I get from the server, it seems that the mail fields are being received properly. However, this is a file that was not received. I'm not sure what I did wrong. Any input is welcome.

EDIT: Attaching a detailed answer:

 * 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-- 

I know that the username and pw data are correctly read by the server, since I tested it with erroneous information and a credential error received.

+7
php curl multipartform-data
source share
1 answer

When you tell cURL to download a file, the Content-Type header is automatically set to multipart/form-data . To request, as in your documentation, you will have to download the file manually.

 <?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); 

It works?

+8
source share

All Articles