doujuan2688
2017-07-25 10:37
浏览 170
已采纳

Curl PHP PUT请求更改文件内容

I use a PUT request with curl php in one of my scripts to upload a file to an external file repository using a REST API. However, the uploaded files contain information about the Content-Disposition, the Content-Type and some alpha-numeric code at both the beginning and the end of the file, rendering the useless unless manually enditing again.

The unnecessary overhead looks like this:

--------------------------e876c4b8eee91562 Content-Disposition: form-data; name="test_file"; filename="test_3.xlsx" Content-Type: application/octet-stream

The code I use to do the request is:

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

I can't change the request to POST, as the REST API on the other side needs a PUT request. Any ideas on how to get rid of the overhead?

图片转代码服务由CSDN问答提供 功能建议

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

我用来执行请求的代码是: \ n

  $ 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(
'接受 :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条回答 默认 最新

  • dongyu4908 2017-07-31 12:51
    已采纳

    OK. I found the answer to the question here: PHP Curl post a file without header

    Thus changing the line

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    

    to

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

    fixes the issue. This is probably not a very "clean" solution, but it works. I'd be glad to hear about better solutions though.

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • dtpwra8456 2017-07-31 16:28

    Just as a note (I don't have enough points yet to make comments).

    I think @stopopol answer is actually the right one. I am no PHP expert but it seems to me that you were indeed sending a key/value form-data. B2SHARE API expects a binary content and saves exactly what you send to it as a file. The Headers are ok. The 'Accept:application/json' DOES NOT specify the content-type of the file you are sending but the type you are expecting in return, i.e. the answer from the server.

    Note also that there is an error in the curl command given in the B2SHARE documentation. It will be fixed soon. The file upload should use --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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题