收藏
回答

小程序临时文件上传,文件名称不带文件后缀上传肯定失败吗?

api地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/uploadTempMedia.html

小程序客服 /客服消息 /新增图片素材

图片链接地址,没有文件后缀:https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=1667994205,255365672&fm=5d
代码:
String token = this.getAccountAccessToken(account);
String uploadMediaUrl = UPLOAD_MEDIA_URL + "?access_token=" + token + "&type=" + type;

// 定义数据分隔符
String boundary = "------------zhiddatauploadfile";
try {
    // 根据内容类型判断文件扩展名
    String suffix = mediaFileUrl.substring(mediaFileUrl.lastIndexOf(".")+1);
    String fileName = "file." + suffix;
    

    URL uploadUrl = new URL(uploadMediaUrl);
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());

    HttpsURLConnection uploadConn = (HttpsURLConnection) uploadUrl.openConnection();
    uploadConn.setDoInput(true);
    uploadConn.setDoOutput(true);
    uploadConn.setSSLSocketFactory(sc.getSocketFactory());
    uploadConn.setHostnameVerifier(new TrustAnyHostnameVerifier());

    uploadConn.setRequestMethod("POST");
    // 设置请求头Content-Type
    uploadConn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    // 获取媒体文件上传的输出流(往微信服务器写数据)
    OutputStream outputStream = uploadConn.getOutputStream();

    BufferedInputStream bis = null;
    HttpsURLConnection httpsMediaConn = null;
    boolean error=false    ;
   
     
          URL httpsMediaUrl = new URL(mediaFileUrl);

          httpsMediaConn = (HttpsURLConnection) httpsMediaUrl.openConnection();
          SSLContext httpsSC = SSLContext.getInstance("SSL");
          httpsSC.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());

          httpsMediaConn.setSSLSocketFactory(httpsSC.getSocketFactory());
          httpsMediaConn.setHostnameVerifier(new TrustAnyHostnameVerifier());

          httpsMediaConn.setRequestMethod("GET");

          int httpRetCode = httpsMediaConn.getResponseCode();
          // 如果有重定向
          if (httpRetCode == 301 || httpRetCode == 302 || httpRetCode == 303) {
             String redictURL = httpsMediaConn.getHeaderField("Location");
             URL redirectUrl = new URL(redictURL);
             SSLContext redirect = SSLContext.getInstance("SSL");
             redirect.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());

             HttpsURLConnection redirectConn = (HttpsURLConnection) redirectUrl.openConnection();
             redirectConn.setSSLSocketFactory(redirect.getSocketFactory());
             redirectConn.setHostnameVerifier(new TrustAnyHostnameVerifier());

             redirectConn.setRequestMethod("GET");

             // 从请求头中获取内容类型
             String contentType = redirectConn.getHeaderField("Content-Type");

             // 请求体开始
             outputStream.write(("--" + boundary + "\r\n").getBytes("utf-8"));
             outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", fileName).getBytes());
             outputStream.write(String.format("Content-Type: %s\r\n\r\n", contentType).getBytes());
             // 获取媒体文件的输入流(读取文件)
             bis = new BufferedInputStream(redirectConn.getInputStream());
byte[] buf = new byte[8096];
int size = 0;
while ((size = bis.read(buf)) != -1) {
    // 将媒体文件写到输出流(往微信服务器写数据)
    outputStream.write(buf, 0, size);
}
// 请求体结束
outputStream.write(("\r\n--" + boundary + "--\r\n").getBytes());
outputStream.close();
bis.close();

// 获取媒体文件上传的输入流(从微信服务器读数据)
InputStream inputStream = uploadConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuffer buffer = new StringBuffer();
String str = null;
while ((str = bufferedReader.readLine()) != null) {
    buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
uploadConn.disconnect();

// 解析返回结果
JsonNode jsonNode = JsonUtil.getObjectMapper().readTree(buffer.toString());
// 测试打印结果
logger.info("[uploadFile] weixin return:" + jsonNode + "," + uploadMediaUrl);



回答关注问题邀请回答
收藏

2 个回答

  • Mr.Zhao
    Mr.Zhao
    10-24

    加上后缀试试呗

    10-24
    有用 1
    回复 3
    • JPbadBF
      JPbadBF
      10-27
      试了是可以
      10-27
      回复
    • JPbadBF
      JPbadBF
      10-27
      想确认下是不是必须有后缀
      10-27
      回复
    • Mr.Zhao
      Mr.Zhao
      10-27回复JPbadBF
      都可以了,不就是说明跟后缀没关系,怎么样才能让你确认
      10-27
      回复
  • JPbadBF
    JPbadBF
    10-24

    获取这个接口调用响应时 获取到的结果为:

    40004invalid media type不合法的媒体文件类型

    是不是因为没有文件名称后缀

     outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", fileName).getBytes());
    
    filename=com/6ONXsjip0QIZ8tyhnq/it/u=1667994205,255365672&fm=5d
    
    10-24
    有用
    回复
登录 后发表内容