我在我的一个脚本中使用curl php的PUT请求,使用REST API将文件上传到外部文件存储库 . 但是,上传的文件包含有关Content-Disposition,Content-Type和文件开头和结尾的一些字母数字代码的信息,除非再次手动终止,否则无效 .
不必要的开销看起来像这样:
-------------------------- e876c4b8eee91562 Content-Disposition:form-data; NAME = “test_file里面”; filename =“test_3.xlsx”Content-Type:application / octet-stream
我用来做这个请求的代码是:
$ch = curl_init($upload_url);
$cfile = new CURLFile($file_realpath, 'application/octet-stream', $base_file_name);
$data = array ('test_file' => $cfile);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:application/json',
'Content-Type:application/octet-stream',
));
b2share_ignore_certificates($ch);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$headerSent = curl_getinfo($ch, CURLINFO_HEADER_OUT);
curl_close($ch);
我无法将请求更改为POST,因为另一方的REST API需要PUT请求 . 关于如何摆脱开销的任何想法?
2 回答
好 . 我在这里找到了问题的答案:PHP Curl post a file without header
从而改变了这条线
至
解决了这个问题 . 这可能不是一个非常“干净”的解决方案,但它确实有效 . 我很高兴听到更好的解决方案 .
就像一张纸条(我还没有足够的观点来评论) .
我认为@stopopol答案实际上是正确的 . 我不是PHP专家,但在我看来,你确实发送了一个键/值表单数据 . B2SHARE API需要二进制内容,并准确保存您作为文件发送给它的内容 . Headers 还可以 . 'Accept:application / json'不指定您要发送的文件的内容类型,而是指定您期望的类型,即服务器的答案 .
另请注意,B2SHARE文档中给出的curl命令中存在错误 . 它很快就会修好 . 文件上传应使用
--data-binary
:curl -X PUT -H 'Accept:application/json' -H 'Content-Type:application/octet-stream' --data-binary @TestFileToBeUploaded.txt https://$HOSTNAME/api/files/$FILE_BUCKET_ID/TestFileToBeUploaded.txt?access_token=$ACCESS_TOKEN