使用 cURL 上传文件时,文件会使用标头信息进行修改



使用 cURL 上传文件时,我发现远程端的文件被修改,标头信息被转储到文件中。我怀疑这是我的标题信息中的内容,但除此之外我迷失了方向。我几乎在尝试任何事情。

这是我正在使用的代码。

$fLocation = realpath('file.csv');  
$finfo = finfo_open(FILEINFO_MIME_TYPE);  
$fType = finfo_file($finfo, $fLocation);  
finfo_close($finfo);      
$cFile = curl_file_create($fLocation);  
$post = array('file'=> $cFile);  
$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_POST,1);  
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password);  
curl_setopt($ch, CURLOPT_HTTPHEADER, "Content-Type: application/octet-stream");  
$result = curl_exec($ch);  

我已经为标题尝试了一些不同的内容类型,从应用程序/二进制到多部分/表单数据,甚至根本不在标题中发送内容类型。我怀疑我需要在标题中添加更多内容。

无论如何,我发送的文件是.csv,但我想最终发送一个.xlsx文件(我正在使用.csv进行测试(。当我从远程服务器获取文件并在文本编辑器中打开它时,我看到文件开头和结尾添加了信息,中间是文件的原始数据。以下是添加到顶部的内容。

=--------------------------a0fe4530540c659b  
Content-Disposition: form-data; name="file"; filename="/home/username/website/path/file.csv"  
Content-Type: application/octet-stream 

而且,底部

--------------------------a0fe4530540c659b--

从本质上讲,当我的所有.xlsx文件到达另一边后都已损坏时,我就想通了这一点。我更改了要发送到纯文本文件(CSV(的内容,那时我才意识到发生了什么。

这里有更多有趣的信息。实际上是我通过他们的API向ZenDesk发送一些东西,我显然是使用cURL在PHP中这样做的。当我从 Zendesk 收到 JSON 回复时,其中一部分看起来像这样......

[file_name] => file.csv  
[content_url] => https://org.zendesk.com/attachments/token/jdjdjdjdjdjhdjdjdj/?name=file.csv  
[content_type] => multipart/form-data  
[size] => 5615  

有趣的是,它看到我上传的内容是多部分/表单数据。即使我更改标题中的内容类型,这仍然是正确的。

当然,我在这里错过了一些愚蠢而容易的东西。

您无需设置Content-Type: application/octet-stream或其他标头即可上传文件。 只需要使用curl_file_create方法发送文件。

你的代码必须是这样的东西:

if (function_exists('curl_file_create')) { // for php 5.5+
$File_Address = curl_file_create($file_name_with_full_path);
} else {
$File_Address = '@' . realpath($file_name_with_full_path);
}
$post = array('file_name'=> $File_Address);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password);
$result = curl_exec($ch);

只是为了让每个人都知道,这与标题有关。这是最终为我解决问题的代码。

$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10 );
curl_setopt($ch, CURLOPT_URL, $json_url);
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/binary'));
curl_setopt($ch, CURLOPT_POST, true);
$file = fopen($fLocation, 'r');
$size = filesize($fLocation);
$fildata = fread($file,$size);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fildata);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_INFILESIZE, $size);
curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$result = curl_exec($ch);

最新更新