php如何post 2进制数据到接口

  php如何post 2进制数据到接口,如客户端上传的文件,不需要再服务器端保存,而直接保存到其他网盘,数据库存储网盘返回的url地址什么的,节省服务器空间。

  可以构造HTTP POST请求的信息体,用file_get_contents POST请求发送到接口即可。

  php如何post 2进制数据到接口源代码如下,POST信息体构造代码来源:https://stackoverflow.com/questions/4003989/upload-a-file-using-file-get-contents

<?php
if($_POST["action"]=="upload"){
  define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
//没怎么玩PHP,这里有个坑啊。。玛达。。用单引号括起的字符\r\n直接是字符串,不是换行字符,要用双引号括起才是。导致content-type和user-agent请求头在一行上了,设置不了content-type。。
  $header = "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0\r\nContent-Type: multipart/form-data; boundary=".MULTIPART_BOUNDARY;
  define('FORM_FIELD', 'smfile'); 
  $file_contents = file_get_contents($_FILES["smfile"]["tmp_name"]);    //读取临时文件的2进制内容
//可以这里修改POST的键名称,文件名。
  $content =  "--".MULTIPART_BOUNDARY."\r\n".
            "Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"smfile.jpg\"\r\n".
            "Content-Type: application/jpeg\r\n\r\n".
            $file_contents."\r\n";
   //其他表单内容
  $content .= "--".MULTIPART_BOUNDARY."\r\n".
            "Content-Disposition: form-data; name=\"bb\"\r\n\r\n".
            "test\r\n";
  $content .= "--".MULTIPART_BOUNDARY."--\r\n";
 
  $context = stream_context_create(array(
    'http' => array(
          'method' => 'POST',
          'header' => $header,
          'content' => $content,
    )
  ));
 $s= file_get_contents('https://sm.ms/api/upload', false, $context);
 if($s!==false){
	 echo $s;
	 $o=json_decode($s);
	 if($o->code=="success")echo "<img src='".$o->data->url."'/>";
	 else echo $o->msg;
 }
 else echo "上传失败";
}
?>
<form method="post" enctype="multipart/form-data" action="t.php">
  <input type="file" name="smfile" /><input type="hidden" name="action" value="upload" />
  <input type="submit" />
</form>

 


评论(0)网络
阅读(55)喜欢(0)PHP/apache/Perl