PHP后台上传图片

前台图片上传

比较普遍用这种方式,页面通过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

发表评论

电子邮件地址不会被公开。 必填项已用*标注