PHP-Can';不要在我的restful服务中发布图像

PHP-Can';不要在我的restful服务中发布图像,php,rest,curl,Php,Rest,Curl,我正在尝试使用cURL将图像发布到我的REStful服务的图片上传方法中 restful服务需要以下格式的请求:- Accept: application/json Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Content-Length: 782 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5dQ1ta4rvOvWt

我正在尝试使用cURL将图像发布到我的REStful服务的图片上传方法中

restful服务需要以下格式的请求:-

Accept: application/json
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

Content-Length: 782
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5dQ1ta4rvOvWtjff
它还使用授权令牌字符串

以下是我的PHP代码:-

$\u FILES['file']作为$data作为旁注传递给此

move_uploaded_file($data["tmp_name"], "../uploaded_files/images/".$data["name"]);
$data_string = "@".realpath("../uploaded_files/images/".$data["name"]).";type=image/png";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CERTINFO, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$boundary = md5(date('U'));
$http_headers = array(
    'Authorization: Bearer '.$_SESSION['Auth'],
    'Accept: application/json',
    'Accept-Encoding: gzip,deflate,sdch',
    'Content-Length: '.$data['size'],
    "Content-Type: multipart/form-data; boundary=$boundary"."\r\n"              
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $http_headers);

$result = curl_exec($ch);
$info = curl_getinfo($ch);
就我所知,这应该是匹配和工作,但它没有。当我包含内容长度时(根据需要,否则将生成411代码),服务器将冻结,然后在很长时间后生成此错误:-

SSL read: error:00000000:lib(0):func(0):reason(0), errno 0
有人知道我可能做错了什么吗?我能够使用上面的代码成功地发布JSON和其他内容类型,这似乎只是我试图以这种方式发布图像的一种特殊方式

编辑:我被告知@method for file upload已被弃用,因此我将代码调整为:-

$path = realpath("../upload_files/images/".$data["name"]);
$cfile = curl_file_create($path, 'image/png','file_upload');
$data_string = array('file_upload' => $cfile);
然而,现在它为“坏请求”生成400状态代码。我使用这种方法是错误的,还是我遗漏了什么?我也尝试过下面的面向对象版本,但它产生了相同的问题

$cfile = new CURLFile($path,'image/png','file_upload');

问题很可能与请求的内容类型有关。判断给定格式时,应将其设置为
multipart/form data
,即发送的数据应编码为
multipart/form data
。根据,要将
内容类型
标题设置为
多部分/表单数据
,您必须将
CURLOPT_POSTFIELDS
选项设置为
数组
(而不是代码中的URL编码字符串)。在这种情况下,数据将自动编码为多部分/表单数据

因此,您的代码应该如下所示:

move_uploaded_file($data["tmp_name"], "../uploaded_files/images/".$data["name"]);
$path = realpath("../uploaded_files/images/".$data["name"]);
$data = array('file' => "@$path;type=image/png");
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
...

顺便说一句:
@
前缀仅在PHP5.5.0之后才被弃用

我发现了这个问题

my cURL试图连接的restful服务需要设置内容处置头,而cURL在设置自己的边界时故意忽略了这一点

在这种情况下,我不可能用PHP按原样使用这个API的方法来完成我要做的事情


也就是说,除非有人知道可以在不同的php库中设置内容配置。

@filename用于文件上载的API已被弃用。您可以改为使用CURLFile类。我已经调整了代码以使用该类,但是现在我收到了一个代码400错误的请求。调试CURL,查看发送了什么标题/正文。不过内容类型设置为多部分/表单数据。我已经将POSTfield变量($data_string)设置为数组,但是现在服务用一个代码400:Bad请求拒绝它,这对我来说没有任何意义。我发现了这个问题,它是如何编写cURL的,以及如何编写这个RESTful API的服务来解释被请求的头的方法的组合。我已经发布了一个详细的答案。