我在我的一个脚本中使用curl php的PUT请求,使用REST API将文件上传到外部文件存储库。但是,上传的文件包含有关Content-Disposition,Content-Type和文件开头和结尾的一些字母数字代码的信息,除非再次手动终止,否则无效。
不必要的开销如下:
-------------------------- e876c4b8eee91562 Content-Disposition:form-data; NAME = “test_file里面”; filename =“test_3.xlsx”内容类型: 应用/八位字节流
我用来执行请求的代码是:
$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请求。关于如何摆脱开销的任何想法?
答案 0 :(得分:1)
行。我在这里找到了问题的答案: PHP Curl post a file without header
因此改变了行
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
到
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($file_realpath));
解决了这个问题。这可能不是一个非常“干净”的解决方案,但它确实有效。我很高兴听到更好的解决方案。
答案 1 :(得分:0)
就像一张纸条(我还没有足够的要点发表评论)。
我认为@stopopol答案实际上是正确答案。我不是PHP专家,但在我看来,你确实发送了一个键/值表单数据。 B2SHARE API需要二进制内容,并准确保存您作为文件发送给它的内容。 标题还可以。 '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