php中模拟file上传,PHP curl 模拟表单数据流multipart/form-data上传文件

在调用公众号接口https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

经过多次测试使用下面的方式,可以正常上传

//调用测试

protected static $url;

protected static $delimiter;

protected static $instance;

public function index()

{

static::$delimiter = uniqid();

$basename = Request::instance()->root();

if (pathinfo($basename, PATHINFO_EXTENSION) == 'php') {

$basename = dirname($basename);

}

$result=$this->wxAddMaterial($token,$basename.'/upload/images/gnlog.jpg','image');

}

// 新增其他类型永久素材

public function wxAddMaterial($token,$filename='',$type='') {

// 设置请求参数

static::$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token."&type=".$type;

$filePath = str_replace('\\', '/', $filename);

// 发送请求

$imginfo=pathinfo($filePath);

$fields = array(

'media'=>file_get_contents(".".$filePath),

'filename'=>$imginfo["basename"],

);

$res = $this->putPart( $fields);

// 发送请求

return $res;

}

//推送文件流

public function putPart($param) {

$post_data = static::buildData($param);

$curl = curl_init(static::$url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

curl_setopt($curl, CURLOPT_POST, true);

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

curl_setopt($curl, CURLOPT_HTTPHEADER, [

"Content-Type: multipart/form-data; boundary=" . static::$delimiter,

"Content-Length: " . strlen($post_data)

]);

$response = curl_exec($curl);

curl_close($curl);

return $response;

}

//编译请求头格式和数据流

private static function buildData($param){

$data = '';

$eol = "\r\n";

$upload = $param['media'];

unset($param['media']);

foreach ($param as $name => $content) {

$data .= "--" . static::$delimiter . "\r\n"

. 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"

. $content . "\r\n";

}

$data .= "--" . static::$delimiter . $eol

. 'Content-Disposition: form-data; name="media"; filename="' . $param['filename'] . '"' . "\r\n"

. 'Content-Type:application/octet-stream'."\r\n\r\n";

$data .= $upload . "\r\n";

$data .= "--" . static::$delimiter . "--\r\n";

return $data;

}

根据自己的实际情况稍作修改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值