当前位置:首页 » 《我的小黑屋》 » 正文

使用OkHttp3以Multipart/Form-Data方式上传文件

10 人参与  2024年09月25日 14:02  分类 : 《我的小黑屋》  评论

点击全文阅读


今天遇到了一个上传图片接口,后端获取file老是为null,仔细一看是ContentType:multipart/form-data,这中方式我用的不多,这边记录下.

准备工作

首先,确保项目已经添加了OkHttp3库的依赖:

implementation 'com.squareup.okhttp3:okhttp:4.9.0'

ContentType概述

ContentType,也称为媒体类型或MIME类型,用于描述网络请求和响应中的内容类型。以下是一些常见的ContentType:

text/plain:普通文本text/html:HTML文档application/json:JSON数据application/xml:XML数据image/jpeg:JPEG图片image/png:PNG图片multipart/form-data:用于文件上传

本文主要关注multipart/form-data,因为它通常用于表单提交,特别是包含文件上传的表单。

步骤

创建MediaType

MediaType mediaType = MediaType.parse("image/jpeg");

MediaType用于描述文件类型,这里我们上传的是JPEG格式的图片。

创建RequestBody

RequestBody fileBody = RequestBody.create(mediaType, photoFile);

RequestBody用于封装待上传的文件数据。

创建MultipartBody

RequestBody requestBody = new MultipartBody.Builder()        .setType(MultipartBody.FORM)        .addFormDataPart("file", photoFile.getName(), fileBody)        .build();

MultipartBody用于构建多部分表单请求,这里添加了文件部分。

添加请求头
我也不知道他为什么要把参数放在url里面…

Request request = new Request.Builder()        .url("http://xx.xx.x.xx:xxxxx/fileUploadAndDownload/upload?detailNo=1234&noSave=0")        .addHeader("X-Token", token)        .post(requestBody)        .build();

这里我们添加了自定义的请求头X-Token

发送请求

OkHttpClient client = new OkHttpClient();client.newCall(request).enqueue(new Callback() {    @Override    public void onFailure(Call call, IOException e) {        e.printStackTrace();    }    @Override    public void onResponse(Call call, Response response) throws IOException {        if (!response.isSuccessful()) {            throw new IOException("Unexpected code " + response);        }        System.out.println(response.body().string());    }});

通过OkHttpClient发送请求,并处理响应。

完整代码

使用OkHttp3以multipart/form-data方式上传图片的示例代码。

import okhttp3.*;import java.io.File;import java.io.IOException;import java.util.Map;import java.util.Set;public class UploadImage {    private static final String TAG = "UploadImage";    public static void main(String[] args) {        // 创建MediaType        MediaType mediaType = MediaType.parse("image/jpeg");                // 图片文件路径        File photoFile = new File("path/to/your/photo.jpg");        // 创建RequestBody        RequestBody fileBody = RequestBody.create(mediaType, photoFile);                // 创建MultipartBody        RequestBody requestBody = new MultipartBody.Builder()                .setType(MultipartBody.FORM)                .addFormDataPart("file", photoFile.getName(), fileBody)                .build();        // 获取自定义请求头        Map<String, String> headers = EasyConfig.getInstance().getHeaders();        String token = headers.get("X-Token");        Set<String> keySet = headers.keySet();        for (String key : keySet) {            Log.i(TAG, "uploadImage: " + headers.get(key));        }        // 创建Request        Request request = new Request.Builder()                .url("http://192.168.6.162:8888/fileUploadAndDownload/upload?detailNo=1234&noSave=0")                .addHeader("X-Token", token)                .post(requestBody)                .build();        // 创建OkHttpClient        OkHttpClient client = new OkHttpClient();        // 发送请求        client.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                e.printStackTrace();            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (!response.isSuccessful()) {                    throw new IOException("Unexpected code " + response);                }                // 处理响应                System.out.println(response.body().string());            }        });    }}

…:

我这边使用的是EasyHttp库,multipart/form-data不知道怎么设置,导致EasyHttp上传不了图片.所以才用原生的api先学习,这边也贴一下EasyHttp使用multipart/form-data上传图片.

 // 创建RequestBody,指定媒体类型和文件        RequestBody fileRequestBody = RequestBody.create(MediaType.parse("image/jpeg"), photoFile);        // 创建MultipartBody.Part,指定字段名和RequestBody        MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", photoFile.getName(), fileRequestBody);        // 构建MultipartBody        MultipartBody requestBody = new MultipartBody.Builder()                .setType(MultipartBody.FORM)                .addPart(filePart)                .build();        EasyHttp.post(this)                .api(new UploadApi())                .body(requestBody)                .request(new OnUpdateListener<Void>() {                    @Override                    public void onUpdateProgressChange(int progress) {                        Log.i(TAG, "onUpdateProgressChange: "+progress);                    }                    @Override                    public void onUpdateSuccess(Void result) {                        Log.i(TAG, "onUpdateSuccess:");                    }                    @Override                    public void onUpdateFail(Throwable throwable) {                        Log.i(TAG, "onUpdateFail:");                    }                });

end


点击全文阅读


本文链接:http://zhangshiyu.com/post/164430.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 相国独子的丫鬟砸坏我的玉佩后,我当场拒婚阅读_玉佩陈郡谢氏全新_小说后续在线阅读_无删减免费完结_
  • 手术时,我看着病人惨死最新试读_淼淼陆知衍姜颜全本完结_小说后续在线阅读_无删减免费完结_
  • 男友霸道给我开黑卡,转头却骂我是捞女最新章节_肖年顾客黑卡热文_小说后续在线阅读_无删减免费完结_
  • 他在回忆尽头全集_贺南舟许清梨叶絮完结txt_小说后续在线阅读_无删减免费完结_
  • 旅游结婚那天未婚夫另娶女秘书,我让他们一无所有连载_老公迎宾超长版_小说后续在线阅读_无删减免费完结_
  • 完结文异界修仙我的直播间能打赏核弹列表_完结文异界修仙我的直播间能打赏核弹(江流年沈红菱)
  • 全书浏览陪弟弟混骑行圈,离婚你哭什么?(韩星河柳千雪)_陪弟弟混骑行圈,离婚你哭什么?(韩星河柳千雪)全书结局
  • 老公出轨我助攻虐心反转_秦绍卿卿阿溪后续加长_小说后续在线阅读_无删减免费完结_
  • 替老婆坐牢出狱那天,我被送去斗兽场精校文本_许言沈宇郑子番茄热门_小说后续在线阅读_无删减免费完结_
  • 沐巍澜温溪:结局+番外(爱如一刹花火)电子书畅享阅读无广告
  • 傅凌川林柚续集(傅凌川林柚)章节前文+全书阅读(替嫁燃婚:小祖宗嘴硬腰软)最新连载
  • 资助生把导盲犬做成火锅后,我家杀疯了!列表_资助生把导盲犬做成火锅后,我家杀疯了!(陈米雪波波)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1