使用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);  

我已经尝试了几种不同的Header内容类型,从application / binary到multipart / form-data,甚至根本没有在header中发送content-type。我怀疑我需要在标题中添加更多内容。

无论如何,我要发送的文件是.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发送一些东西,而我显然是在PHP中使用cURL进行此操作。当我从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,这仍然适用。

当然,我在这里缺少愚蠢和容易的事情。

保罗·迈克尔

所有人都知道,这与标题有关。这是最终为我解决问题的代码。

$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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用iframe上传文件时如何添加请求标头?

使用cURL上传文件

为什么使用 cURL 上传的文件在文件的开头包含请求标头的一部分(例如边界、内容类型)?

Curl:从文件中读取标头,并在cURL命令中使用它们

获取使用net / http request处理的上传文件的Content-Type标头。ParseMultipartForm

Angular文件上传时,对于某些大小的文件,没有“ Access-Control-Allow-Origin”标头错误

无法修改标头信息-标头已由发送

警告:无法修改标头信息 - 标头已发送

无法修改输出已发送的标头信息标头

无法修改标头信息-标头已发送

错误无法修改标头信息 - 标头已发送

API调用缺少用于文件传输的标头信息

如何使用Spring Batch将标头和尾标写入现有文件,而又不覆盖该文件中的信息?

使用标头时,是否需要插入cpp文件中使用的每个函数?

使用rsync仅上传文件的修改部分

Google表格上传文件-使用/修改响应

如何使用php使用curl上传文件

使用共享访问签名时 Azure 创建文件 REST API 的授权请求标头

在使用actix-files提供静态文件时,如何设置“ expire”或“ Cache-Control”标头?

IOException:'无效的标头字段;使用清单创建.jar文件时

使用PySpark读取.ORC文件时,即使显式指定的标头也丢失

正确使用Blade(Laravel),在其自己的文件中包含标头时遇到问题

在 Swift 项目中使用 C++ 文件时包含错误的标头

将Access-Control-Allow-Origin标头添加到使用PHP客户端库上传的文件中

使用Xvfb在无头模式下运行测试时,无法使用sendkeys()上传图像文件?

打开Excel文件时无效的LOC标头(错误的签名)

通过星号调用文件发起时添加SIP标头

尝试在csv文件中实现标头时出错

编译包含LLVM API标头的C ++文件时出错