关于微信公众号开发上传永久素材时,提示40015

本文介绍了一种解决PHP5.6及以上版本中使用CURL上传文件遇到40015错误的方法。通过使用newCURLFILE替代@符号来上传文件,避免了错误的发生,并提供了一个具体的代码实现示例。

1、关于上传永久素材时,提示40015.

    问题在于php 5.6之后CURL不允许使用 @上传问题,可以使用 new CURLFILE('文件代替')或者 curl_create_file代替

   下面附上一段代码

 

   

<?php
 
 
header('content-type:text/html;charset=utf-8');
error_reporting( E_ALL ^ E_NOTICE);
function CurlPost($url, $param = [], $is_Post = 1 ,$timeout = 10)
{
 
 
    //初始化curl
    $curl = curl_init();
 
 
    curl_setopt($curl, CURLOPT_URL, $url); // 设置请求的路径
 
 
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
 
 
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
    if( $is_Post  ){
 
 
        curl_setopt($curl, CURLOPT_POST, 1); //设置POST提交
 
 
        curl_setopt($curl,CURLOPT_SAFE_UPLOAD , true );
 
 
        //提交数据
        if (is_array($param)) {
#不能使用http_bulid_query
            curl_setopt($curl, CURLOPT_POSTFIELDS, ($param));
//            @curl_setopt($curl, CURLOPT_POSTFIELDS, ($param));
        } else {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
        }
    }
 
 
 
 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //显示输出结果
 
 
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
 
 
 
 
    //执行请求
    $data = $data_str = curl_exec($curl);
 
 
    //处理错误
    if ($error = curl_error($curl)) {
        $logdata = array(
            'url' => $url,
            'param' => $param,
            'error' => '<span style="color:red;font-weight: bold">' . $error . '</span>',
        );
 
 
        var_dump($logdata);
        exit;
    }
 
 
 
 
    curl_close($curl);
 
 
    //json数据转换为数组
    $data = json_decode($data, true);
 
 
    if (!is_array($data)) {
        $data = $data_str;
    }
 
 
    return $data;
 
 
}
 
$token = 'L3VWbz5oaUc5LS-3pTmso5Sa3GW4BqPZ3bMiz4Zy0poixY4OYrlF-S_V4jmQ5EYNaJzYXTUuc3fS8KLtPIYfAKplq4AtrAwKFCxlGSwlq2gOVZhAAAJQU';
 
 
# 临时素材的接口
$upload_url = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$token.'&type=image';
 
 
$cfile = curl_file_create('C:\wamp\www\weixin\a.jpg');
 
 
$data = array(
//    'media'=>$cfile,
//    'media'=>'@'.realpath('a.jpg'),
    'media'=> new CURLFile('C:\wamp\www\weixin\a.jpg'),
    'form-data' => [
        'filename' =>'a.jpg',
        'filelength'=>1839,
        'content-type'=>'image/jpeg'
    ]
 
 
);
 
$result = CurlPost( $upload_url , $data );
 
 
var_dump($result);

### 微信公众号API上传永久视频素材教程 #### 准备工作 为了能够顺利调用微信公众号的API来上传永久视频素材开发者需先获取`access_token`。此令牌用于验证请求的身份合法性。 #### 构建HTTP POST 请求 构建向微信公众平台发送POST请求以上传视频素材,除了常规的文件流外,还需提供描述信息作为JSON对象的一部分。具体来说,在Java环境中实现这一功能可以参照如下方式: ```java // 定义上传媒体材料的基础URL String uploadUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=video"; // 创建连接并设置必要的属性 URL urlObj = new URL(uploadUrl); HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); conn.setDoOutput(true); // 启用输出 conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); // 设置Content-Type头部字段为multipart/form-data形式 String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); // 开始组装body部分的数据 StringBuilder sb = new StringBuilder(); // 添加description JSON字符串到body中 sb.append("--").append(boundary).append("\r\n"); sb.append("Content-Disposition: form-data; name=\"description\"\r\n\r\n"); sb.append("{\"title\":\"test\",\"introduction\":\"this is a test\"}"); // 这里填写实际的内容 sb.append("\r\n"); // 将准备好的byte数组写入OutputStream DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream()); outputStream.writeBytes(sb.toString()); // 接下来处理文件数据... FileInputStream fis; try { File file = new File("/path/to/video.mp4"); // 替换为真实的文件路径 byte[] buffer = Files.readAllBytes(file.toPath()); // 继续追加文件内容至body内 outputStream.write(("--" + boundary + "\r\n" + "Content-Disposition:form-data;name=\"media\";" + "filename=\"" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8.name()) + "\"\r\n" + "Content-Type:" + URLConnection.guessContentTypeFromName(file.getName()) + "\r\n\r\n").getBytes()); // 文件头信息 outputStream.write(buffer); outputStream.flush(); // 刷新缓冲区确保所有字节都被写出 // 结束标志位 outputStream.writeBytes("\r\n--" + boundary + "--\r\n"); } finally { if (fis != null){ try { fis.close(); } catch(IOException e){} } } ``` 上述代码片段展示了如何构造一个包含`description`参数在内的多部件表单提交请求体[^1]。注意这里的`description`应该是一个合法的JSON串,它至少包含了两个键值对:一个是标题(`title`),另一个是对该视频的一个简介(`introduction`)。 #### 发送请求与接收响应 一旦完成了以上准备工作之后,则可以通过标准的方式执行网络I/O操作,即通过`HttpURLConnection`类提供的方法读取服务器返回的结果,并对其进行解析得到最终想要的信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值