codecamp

OkHttps 文件上传

http.sync("/upload")
        .addFileParam("test", "D:/download/test.zip")
        .post()     // 上传发法一般使用 POST 或 PUT,看服务器支持

  异步上传也是完全一样:

http.async("/upload")
        .addFileParam("test", "D:/download/test.zip")
        .post()

对接微信的时候,需要通过后台再把图片上传到微信,得到 mediaId 后再执行后面操作。

图片上传接口

@PostMapping("upload")
public WebResult<ImageUploadResult> upload(@RequestParam("img") MultipartFile file) {
    final byte[] bytes;
    try {
        bytes = file.getBytes();
    } catch (IOException e) {
        log.warn("fail to read file", file.getOriginalFilename(), e);
        return new WebResult<>(500, "服务器错误,请稍后再试");
    }
    String md5Hex = DigestUtils.md5Hex(bytes).toUpperCase();
    Map<String, String> mapToSign = new HashMap<>(8);
    mapToSign.put("mch_id", MCH_ID);
    mapToSign.put("media_hash", md5Hex);
    mapToSign.put("sign_type", "HMAC-SHA256");
    //计算签名
    String sign = SignUtils.createSign(mapToSign, "HMAC-SHA256", MCH_KEY, null);

    
    //构造请求Body
    MultipartBody body = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("mch_id", MCH_ID)
            .addFormDataPart("media_hash", md5Hex)
            .addFormDataPart("sign_type", "HMAC-SHA256")
            .addFormDataPart("media", file.getOriginalFilename(), RequestBody.create(MediaType.parse("image/" + FileNameUtil.getExtension(file.getOriginalFilename())), bytes))
            .addFormDataPart("sign", sign)
            .build();

 
    //构造请求
    Request request = new Request.Builder().url("https://api.mch.weixin.qq.com/secapi/mch/uploadmedia")
            .post(body)
            .build();
    OkHttpClient client = new OkHttpClient.Builder()
            .sslSocketFactory(sslManager.getSocketFactory())
            .build();
    //后面的省略了...
}

常见错误

  • 遗漏 MultipartBody.FORM:需要设置

setType(MultipartBody.FORM)

  • 签名错误:需要指定签名算法HMAC-SHA256
  • 其他问题:上传到微信的时候,还需要 SSL 配置,下一篇文章再介绍如何在 OkHttp 中配置 SSL 证书
OkHttps 实现分块下载
OkHttps 上传进度监听
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }