php如何post 2进制数据到接口,如客户端上传的文件,不需要再服务器端保存,而直接保存到其他网盘,数据库存储网盘返回的url地址什么的,节省服务器空间。
可以构造HTTP POST请求的信息体,用file_get_contents POST请求发送到接口即可。
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 "";
else echo $o->msg;
}
else echo "上传失败";
}
?>
加支付宝好友偷能量挖...
2018-6-13网络