Curl PHP PUT请求更改文件内容

时间:2017-07-25 10:37:29

标签: php curl libcurl

我在我的一个脚本中使用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请求。关于如何摆脱开销的任何想法?

2 个答案:

答案 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