[英]PHP Curl post with file attachment; custom content-type header
I have to post a file to a server along side with a few post params. 我必须将一个文件发布到服务器旁边,并附带几个post params。 The documentation I received from this server admin shows an example of what the post request is supposed to look like ( * NOTE the custom content type for the POST "multipart/x-api-remote-integration"):
我从这个服务器管理员收到的文档显示了一个帖子请求应该是什么样子的例子( *注意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--
Below is the php code: 下面是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();
From what I am receiving back from the server, it seems that the post fields are being received properly. 从我从服务器收到的内容来看,似乎正在正确接收帖子字段。 However it's the file that is not being received.
但是它是未收到的文件。 I'm not sure what I did wrong.
我不确定我做错了什么。 Any input is greatly appreciated.
任何输入都非常感谢。
EDIT: Attaching Verbose response: 编辑:附加详细响应:
* About to connect() to hostserver.com port 443 (#0)
* Trying x.x.x.x... * 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 the username and pw data is being read correct by the server as I have tested with erroneous info and received credential error instead. 我知道服务器正在读取用户名和pw数据,因为我已经测试了错误信息并收到了凭据错误。
When you tell cURL to upload a file, the Content-Type
header is automatically set to multipart/form-data
. 当您告诉cURL上传文件时,
Content-Type
标头会自动设置为multipart/form-data
。 For a request like in your documentation, you would have to upload 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);
Does that work? 那样有用吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.