问答详情
源自:2-4 图片消息回复

{"errcode":41005,"errmsg":"media data missing hint: [vhZCFA0310e541]"}

 public static String update(String fileUrl,String accesstoken,String type) throws IOException{

//创建一个文件file

File file = new File(fileUrl);

//判断file文件是否为空

if(file==null){

              throw new IOException("文件不存在");

}

@SuppressWarnings("unused")

String url = MESSAGE_FILE_URL.replace("ACCESS_TOKEN", accesstoken).replace("ACCESS_TOKEN",TYPE);

URL urlobj = new URL(url);

urlobj.openStream();

//httpURLConnection实例的作用是用来做一个请求但潜在网络连接到HTTP服务器

HttpURLConnection urlconnection = (HttpURLConnection) urlobj.openConnection();

//进行urconnection对象设置

urlconnection.setRequestMethod("POST");

urlconnection.setDoInput(true);

urlconnection.setDoOutput(true);

urlconnection.setUseCaches(false);

//设置请求头信息

urlconnection.setRequestProperty("Connetion", "Keep-Aliec");

urlconnection.setRequestProperty("Charset", "UTF-8");

//设置边界

//currentTimeMillis方法获取当前时间信息

String BOUNDARY = "-----------"+System.currentTimeMillis();

//Content-Type,内容类型一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码

//multipart/from-data请求文件上传类型

urlconnection.setRequestProperty("Content-Type","multipart/from-data;boundary="+BOUNDARY);

StringBuilder sb = new StringBuilder();

sb.append("--");

sb.append(BOUNDARY);

sb.append("\r\n");

//Content-Disposition就是当用户请求所得内容存为一个文件的提供一个默认的文件名

sb.append("Content-Disposition:from-data;name=\"file\";filename=\""+file.getName()+"\"\r\n");

//application.octet-stream 只能提交二进制,而且提交一个二进制,如果提交文件的话,只能提交一个文件

//后台接收参数只能有一个,而且还只能是流或者是字节码

sb.append("Content-Type;application/octet-stream\r\n\r\n");

//创建一个byte数组

        //sb对象数据转换成字节码

byte[] head = sb.toString().getBytes("utf-8");

//获取输出流   getoutputStream作用就是返回使用此连接的流

//OutputStream 该抽象类是所有类的字节输出流的父类

//DataOutputStream 创建一个新的数据输出流,以便将数据写入指定的基础输出流,返回为零

OutputStream output = new DataOutputStream(urlconnection.getOutputStream());

//在将字节码数据转入到流对象中

output.write(head);

//文件正文部分

//把文件一流文件的方式 推入url中

//DateinputStream的作用就是file目录的文件以流的方式输入进来

DataInputStream in = new DataInputStream(new FileInputStream(file));

int bytes = 0;

byte []b = new byte[1024];

while((bytes=in.read(b))!=-1){

output.write(b, 0, bytes);

}

//关闭输入流

in.close();

//结尾部分

byte []foot = ("\r\n=="+BOUNDARY+"==\r\n").getBytes("utf-8"); //定义最后数据分割线

//把定义最后的数据分割线字节码数据转入流对象中

output.write(foot);

//刷新

output.flush();

//关闭

output.close();

StringBuffer buffer = new StringBuffer();

BufferedReader reader = null;

String result = null;

try {

//定义一个BufferRader输入流来读取url的响应

reader = new BufferedReader(new InputStreamReader(urlconnection.getInputStream()));

System.out.println(urlconnection.getInputStream());

String line = null;

//while循环读取文字

while((line=reader.readLine())!=null){

buffer.append(line);

}

if(result == null){

result = buffer.toString();

}

} catch (IOException e) {

                e.printStackTrace();

}finally{

//关闭流

            if(reader!=null){

            reader.close();

            System.out.println("关闭");

            }

}

JSONObject jsonobject = JSONObject.fromObject(result);

System.out.println(jsonobject.toString());

String mediaid = jsonobject.getString("media_id");

return mediaid;

}

 AccessToken accesstoken = WeiXinUtil.initaccessToken(); 

  System.out.println(accesstoken.getAccesstoken());

  System.out.println(accesstoken.getExpiresin());

  String url = "E:\\Photshop\\PS练习图片\\cbcfe277b0079c38dfa3b27c8ee36d88.jpg";

  try {

String message = WeiXinUtil.update(url, accesstoken.getAccesstoken(), "type");

   System.out.println(message);

  } catch (IOException e) {

e.printStackTrace();

}


提问者:画画3967669 2017-08-01 22:52

个回答

  • 张兴顺
    2017-08-02 09:45:41
    已采纳

    41005缺少多媒体文件数据

    错误出处:String message = WeiXinUtil.update(url, accesstoken.getAccesstoken(), "type");

    这里的"type"写错了应该写你所要上传的图片的格式,因为你上传的是图片,所以应该是"image"


      

  • dongzhichaogeek
    2019-10-15 12:57:33

    byte []foot = ("\r\n=="+BOUNDARY+"==\r\n").getBytes("utf-8"); //定义最后数据分割线

    == 换 --

  • qq_好好地_0
    2019-06-10 15:47:19

    有解决的嘛,同样是这问题


  • 慕妹1009039
    2017-11-05 11:26:46

    解决办法:因为php版本的原因,上传素材一直保错。php的curl的curl_setopt 函数存在版本差异

    php5.5已经把通过@加文件路径上传文件的方式给放入到Deprecated中了。php5.6默认是不支持这种方式了

    特殊处理1:curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false);

    特殊处理2:$post_data ['media']  = '@'.$file;


  • 慕雪0066171
    2017-11-03 23:51:18

    public static String update(String fileUrl,String accesstoken,String type) throws IOException{

    //创建一个文件file

    File file = new File(fileUrl);

    //判断file文件是否为空

    if(file==null)   throw new IOException("文件不存在");

    String url = UPLOAD_URL.replace("ACCESS_TOKEN", accesstoken).replace("TYPE",type);

    URL urlobj = new URL(url);

    urlobj.openStream();

    //httpURLConnection实例的作用是用来做一个请求但潜在网络连接到HTTP服务器

    HttpURLConnection urlconnection = (HttpURLConnection) urlobj.openConnection();

    //进行urconnection对象设置

    urlconnection.setRequestMethod("POST");

    urlconnection.setDoInput(true);

    urlconnection.setDoOutput(true);

    urlconnection.setUseCaches(false);

    //设置请求头信息

    urlconnection.setRequestProperty("Connection", "Keep-Alive");

    urlconnection.setRequestProperty("Charset", "UTF-8");

    //设置边界

    //currentTimeMillis方法获取当前时间信息

    String BOUNDARY = "-----------"+System.currentTimeMillis();

    //Content-Type,内容类型一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码

    //multipart/from-data请求文件上传类型

    urlconnection.setRequestProperty("Content-Type","multipart/form-data;boundary="+BOUNDARY);

    StringBuilder sb = new StringBuilder();

    sb.append("--");

    sb.append(BOUNDARY);

    sb.append("\r\n");

    //Content-Disposition就是当用户请求所得内容存为一个文件的提供一个默认的文件名

    sb.append("Content-Disposition:form-data;name=\"file\";filename=\""+file.getName()+"\"\r\n");

    //application.octet-stream 只能提交二进制,而且提交一个二进制,如果提交文件的话,只能提交一个文件

    //后台接收参数只能有一个,而且还只能是流或者是字节码

    sb.append("Content-Type:application/octet-stream\r\n\r\n");

    //创建一个byte数组

           //sb对象数据转换成字节码

    byte[] head = sb.toString().getBytes("utf-8");

    //获取输出流   getoutputStream作用就是返回使用此连接的流

    //OutputStream 该抽象类是所有类的字节输出流的父类

    //DataOutputStream 创建一个新的数据输出流,以便将数据写入指定的基础输出流,返回为零

    OutputStream output = new DataOutputStream(urlconnection.getOutputStream());

    //在将字节码数据转入到流对象中

    output.write(head);

    //文件正文部分

    //把文件一流文件的方式 推入url中

    //DateinputStream的作用就是file目录的文件以流的方式输入进来

    DataInputStream in = new DataInputStream(new FileInputStream(file));

    int bytes = 0;

    byte [] b = new byte[1024];

    while((bytes=in.read(b))!=-1){

    output.write(b, 0, bytes);

    }

    //关闭输入流

    in.close();

    //结尾部分

    byte []foot = ("\r\n--"+BOUNDARY+"--\r\n").getBytes("utf-8"); //定义最后数据分割线

    //把定义最后的数据分割线字节码数据转入流对象中

    output.write(foot);

    //刷新

    output.flush();

    //关闭

    output.close();

    StringBuffer buffer = new StringBuffer();

    BufferedReader reader = null;

    String result = null;

    try {

    //定义一个BufferRader输入流来读取url的响应

    reader = new BufferedReader(new InputStreamReader(urlconnection.getInputStream()));

    System.out.println(urlconnection.getInputStream());

    String line = null;

    //while循环读取文字

    while((line=reader.readLine())!=null){

    buffer.append(line);

    }

    if(result == null){

    result = buffer.toString();

    }

    } catch (IOException e) {

       e.printStackTrace();

    }finally{

    //关闭流

                if(reader!=null){

                reader.close();

                System.out.println("关闭");

                }

    }

    JSONObject jsonobject = JSONObject.fromObject(result);

    System.out.println(jsonobject.toString());

    String mediaid = jsonobject.getString("media_id");

    return mediaid;

    }


  • 邓_子
    2017-10-21 17:35:39

    有人解决的,出来分享下啊


  • qq_未_16
    2017-10-08 01:00:02

    urlconnection.setRequestProperty("Connetion", "Keep-Aliec")写错了,Keep-Aliec改为Keep-Alive

  • 慕工程9009011
    2017-09-21 14:48:26

    我也是这个错误,各位有解决吗?

  • qq_Tongchen_0
    2017-09-18 10:06:14

    你好,你现在这个问题解决了没有呢

  • qq_小呀小苹果_0
    2017-08-09 10:58:55

    我也是这个问题,题主解决了吗?

  • 画画3967669
    2017-08-02 10:11:17

    您好老师可是还是报这个错啊,{"errcode":41005,"errmsg":"media data missing hint: [Au7ZpA0819e547]"}