【问题标题】:PHP Curl File Upload sends Empty UploadPHP 卷曲文件上传发送空上传
【发布时间】:2012-06-21 02:23:45
【问题描述】:

我正在尝试转换以下 CURL:

curl -X POST \
  -H "Content-Type: image/jpeg" \
  --data-binary '@myPicture.jpg' \
  https://api.parse.com/1/files/pic.jpg

到 PHP:

$ch = curl_init();
$data = array('myPicture.jpg' => "@myPicture.jpg");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);

$headers = array();
$headers[] = "Content-Type: image/jpeg";
curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt ($ch, CURLOPT_URL, 'https://api.parse.com/1/files/myPicture.jpg');

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch);
curl_close($ch);

但我的回复是false。这是我从print_r(curl_getinfo($ch), true) 得到的:

Array
(
    [url] => https://api.parse.com/1/files/myPicture.jpg
    [content_type] => 
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 0.28
    [namelookup_time] => 0.187
    [connect_time] => 0.218
    [pretransfer_time] => 0.28
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0
    [redirect_time] => 0
)

关于为什么这不起作用的任何想法?谢谢!

【问题讨论】:

  • 你的图片和php文件在同一个文件夹吗?因为您指定了@myPicture.jpg。也尝试使用文件的绝对路径。
  • 对于 jpg 的内容类型,您实际上应该拥有,IMO,$data=file_get_contents("myPicture.jpg");
  • WOOHOO 成功了!!!想要添加您的答案以便我检查吗?

标签: php curl upload


【解决方案1】:

ssl_verify_result 的值为20,根据文档,这意味着:

无法获取本地颁发者证书

找不到本地查找证书的颁发者证书。这通常意味着受信任的证书列表不完整。

您可以不先验证对等方尝试:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

如果可行,您将必须指定最近的 CA 捆绑包的路径。另见:http://curl.haxx.se/docs/sslcerts.html


您还应该检查您尝试上传的文件是否在预期的文件夹中。如果您指定CURLOPT_VERBOSE = 1,它也会警告您。


更新

在检查 API 文档后,该服务不需要定期上传文件(即"multipart/form-data");相反,需要原始上传。

这可以通过以下方式完成:

curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('myPicture.jpg'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: image/jpeg"));

更新 2 使用CURLOPT_POSTFIELDS 传递任何内容都会将请求方法隐式设置为POST,并将Content-Type 设置为application/x-www-form-urlencoded。当您传递一个数组时,这些值可能以@ 开头,以指示文件上传(这样做还应将Content-Type 隐式更改为multipart/form-data)。

命令行curl 允许在几个地方使用@

  1. 使用--data-binary 指定包含原始二进制数据的文件
  2. 使用--data--data-ascii 指定包含url 编码数据的文件
  3. 使用--F--form

后者的行为与将数组传递给CURLOPT_POSTFIELDS 并使用@ 前缀相同。其他两个的行为与传递字符串相同。

【讨论】:

  • 使用这些选项进行了更新,但仍然无法正常工作。 @Thrustmaster 的回答有效 =S
  • @Garrett 我明白了,响应似乎表明存在 SSL 问题;无论如何,我在检查 API 文档后更新了我的答案
  • cURL 中的 @ 是这个意思吗?原始数据?我想我想了解如何解释 cmd 行 cURL。基于该解决方案,我假设这意味着接收 URL 仅需要一个参数 .. 也没有键名?似乎很奇怪。我遇到了与 Garrett 相同的问题,并认为参数需要以与 cmd 行 cURL 相同的@方式进行 k/v 配对。
  • 遇到了类似的问题 (ssl_verify_result = 20),可以通过 CURLOPT_SSL_VERIFYPEER 选项解决。谢谢!!
猜你喜欢
  • 2011-06-07
  • 2013-03-21
  • 1970-01-01
  • 2020-04-24
  • 2013-02-19
  • 1970-01-01
  • 2018-01-17
  • 2017-07-14
  • 2017-08-09
相关资源
最近更新 更多