Curl PHP PUT请求更改文件内容

我在我的一个脚本中使用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)

2 years ago

好 . 我在这里找到了问题的答案:PHP Curl post a file without header

从而改变了这条线

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($file_realpath));

解决了这个问题 . 这可能不是一个非常“干净”的解决方案,但它确实有效 . 我很高兴听到更好的解决方案 .

2 years ago

就像一张纸条(我还没有足够的观点来评论) .

我认为@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