PHP:curl模拟form表单上传文件

PHP:curl模拟form表单上传文件,第1张

需要模拟的就是上面form表单。

curl_setop设置选项

PS:上面例子只有在php5以下版本有效,换言之现在根本没有用 根本没有用 根本没有用 [手动摔桌子],而且现在网上充斥的全是这种过时的失效版本

@字符什么,现在根本没有用誉绝了,不要怀疑你自己,还有网上说只要加上:

就能起效,不用怀疑,这也是没有效的[手动摔桌子],这个选项已经弃用了,现在。

用curlFile代替@,也不需要使用 CURLOPT_SAFE_UPLOAD

替拍蔽换

CURLFILE类的详细使用

PS: $path不要使用网络路庆贺姿径 ( http://xxxx/files/img.png ),要使用本地路径(/files/img.png)

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

上传永久素材文件总是返回 "{\"errcode\":41005,\"errmsg\":\"media data missing\"}"

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

//调用测试

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-databoundary=" . 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-dataname="' . $name . "\"\r\n\r\n"

            . $content . "\r\n"

}

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

        . 'Content-Disposition: form-dataname="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

}

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

如果文件类型是.txt,可以直接用file_get_contents()去获取,再echo出来就行了。

如果是图片,岩吵直接在html中添加晌枣毕img标签引入就行了。

其它情况,要看你的文件类型,浏览器宴芹是不是什么文件都可以直接打开的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12254115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存