前台图片上传
比较普遍用这种方式,页面通过form表单来提交,服务端PHP通过$_FILES来接收
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> 图片:<input type="file" name="img"/> <input type="submit" value="点击上传"/> </form> </body> </html>
我们知道form表单默认是通过application/x-www-urlencoded方式编码传递的。以上form表单指定了通过multipart/form-data的编码方式,支持二进制传输。
那么服务端如果想调用公司平台接口上传呢,下来将进行介绍
后台图片上传
算法 0、通过PHP curl库上传 1、构造header中的内容boundary并传递Content-Type 2、获取二进制图片信息,按正常的参数赋值给参数$bin_param
构造header和body主体方法如下:
/** * 获取Multipart的header和body数据 * * @param array $param 请求参数 * @param array $bin_param 请求参数(二进制内容) * * @return array */ protected function _getMultiData(array $param, array $bin_param) { $boundary = uniqid('------------------'); $MPboundary = '--' . $boundary; $endMPboundary = $MPboundary . '--'; $multipartbody = ''; //遍历普通参数 foreach ($param as $key => $value) { $multipartbody .= $MPboundary . "\r\n"; $multipartbody .= 'content-disposition: form-data; name="' . $key . "\"\r\n\r\n"; $multipartbody .= $value . "\r\n"; } //遍历附件参数 foreach ($bin_param as $key => $value) { $multipartbody .= $MPboundary . "\r\n"; $multipartbody .= 'Content-Disposition: form-data; name="' . $key . '";'; $multipartbody .= ' filename="salmonl.jpg"' . "\r\n"; $multipartbody .= 'Content-Type: application/octet-stream' . "\r\n\r\n"; $multipartbody .= $value . "\r\n"; } $multipartbody .= $endMPboundary; $header = array( "Content-Type: multipart/form-data; boundary=$boundary", ); return array( 'header' => $header, 'body' => $multipartbody, ); }
参考:
深入解析 multipart/form-data
rfc2388
Form-based File Upload in HTML