2014-07-06 52 views
1

我正在处理脚本以将文件上传到http://imagerelay.com。这是我第一次在PHP中使用REST API和cURL。上传有两个阶段。首先将元数据提交给ImageRelay,其中包含本地文件的文件大小。这将返回一个ID号,用于构建用于上传块的URL(使用CLI'split'生成)。但是,当我使用cURL上传文件时,每个文件都会添加额外的219个字节。我怀疑这与cURL的工作方式有关,但我不知道如何在不手动增加阶段1中的文件大小的情况下纠正超龄,减少219个字节* x个数据块。PHP Curl upload_content_length大于文件大小

这是从cURL请求接收到的响应数组。实际的文件块大小为1M(1,048,576字节),而响应显示219个字节在1048795

[http_code] => 201 
[header_size] => 583 
[request_size] => 346 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 2.039208 
[namelookup_time] => 1.2E-5 
[connect_time] => 0.040014 
[pretransfer_time] => 0.13825 
[size_upload] => 1048795 
[size_download] => 1 
[speed_download] => 0 
[speed_upload] => 514314 
[download_content_length] => 1 
[upload_content_length] => 1048795 
[starttransfer_time] => 0.182222 

更下面的代码的相关部分。 $file表示块,并且$resource是预定的,因为它增加了每个块。

$ch = curl_init($resource); 
curl_setopt($ch, CURLOPT_POST, true); 
$pdfData = array('file' => new CurlFile("file-chunks/{$file}", 'application/octet-stream')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$response = curl_exec($ch); 

我很感激任何可以提供的帮助。我一直在为此工作一个星期,并在互联网上搜索,但我无法弄清楚为什么大块的文件大小不匹配upload_content_lengthsize_upload。使用curl在命令行上执行此操作时(而不是CLI上的PHP),我没有同样的问题。谢谢!

[编辑]在第一个句子(意外贴!)[/编辑]删除错字 [EDIT2]新增赏金[/编辑]

+0

HTTP multipart/form-data在表单字段和文件上传(它在内容之前有一种迷你标头)以及它添加的边界字节时确实有一些额外的开销。我没有检查,但也许cURL包括所有的数量。你知道发送到另一端的文件的实际大小吗?如果没有,请尝试将您的代码上传到您自己的PHP脚本中,或者如果可以,请设置一个拦截代理以查看究竟发送了什么。 – zinga

+0

Zinga,这是我收到的最好的反馈。我希望你能用一个例子来发表回复,而不是反馈,我会给你赏金。仍然有3个小时,如果你能做到的话。 –

回答

0

尝试发送文件,这样

$headers = array(
    'Content-Type: multipart/form-data' 
); 

$file = "/full/path/to/file.pdf"; // Full path to file 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$result = curl_exec($ch); 
curl_close($ch); 
+0

图像中继API说明必须将Content-Type设置为application/octet-stream。你认为这是问题吗? –

0

尝试使用选项CURLOPT_VERBOSE并检查STDERR以查看完整的有效负载。

您也可以尝试使用WireShark来检查线路上的情况。 (它可能起初很吓人,但使用起来很简单)。