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

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

16 人参与  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)
  • 赞助本站

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

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

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