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

 更新时间:2024年10月23日 16:13:08   作者:莫翊痕  
在开发过程中,使用multipart/form-data进行图片上传是一个常见的需求,本文通过一个实际案例,讲解了如何在项目中添加OkHttp3库依赖,并使用multipart/form-data进行图片上传,首先,介绍了ContentType的概念和常见类型

今天遇到了一个上传图片接口,后端获取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,因为它通常用于表单提交,特别是包含文件上传的表单。

步骤

1.创建MediaType

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

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

2.创建RequestBody

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

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

3.创建MultipartBody

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

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

4.添加请求头

我也不知道他为什么要把参数放在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

5.发送请求

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:");
                    }
                });

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于在Java中反转数组的4种详细方法

    关于在Java中反转数组的4种详细方法

    这篇文章主要介绍了关于在Java中反转数组的4种详细方法,数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中,今天我们来学习一下如何反转数组
    2023-05-05
  • SpringTask-Timer实现定时任务的详细代码

    SpringTask-Timer实现定时任务的详细代码

    在项目中开发定时任务应该一种比较常见的需求,今天通过示例代码给大家讲解SpringTask-Timer实现定时任务的相关知识,感兴趣的朋友一起看看吧
    2024-06-06
  • springboot幂等切片的实现

    springboot幂等切片的实现

    本文主要介绍了springboot幂等切片的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java实现同步的几种方式(示例详解)

    java实现同步的几种方式(示例详解)

    这篇文章主要介绍了java实现同步的几种方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12
  • Mybatis配置useGeneratedKeys参数的方式

    Mybatis配置useGeneratedKeys参数的方式

    Mybatis的useGeneratedKeys参数用于控制是否允许JDBC支持自动生成主键,并在插入数据时通过keyProperty将生成的主键值返回,当数据库不支持自增主键时,可以使用selectKey来手动实现类似的效果
    2026-01-01
  • SpringBoot+RabbitMQ 实现死信队列的示例

    SpringBoot+RabbitMQ 实现死信队列的示例

    本文主要介绍了SpringBoot+RabbitMQ 实现死信队列的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java判断一个实体是不是空的简单方法

    Java判断一个实体是不是空的简单方法

    这篇文章主要给大家介绍了关于Java判断一个实体是不是空的简单方法,实际项目中我们会有很多地方需要判空校验,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • 如何使用IDEA的groovy脚本文件生成带JPA注解的实体类(图文详解)

    如何使用IDEA的groovy脚本文件生成带JPA注解的实体类(图文详解)

    这篇文章主要介绍了如何使用IDEA的groovy脚本文件生成带JPA注解的实体类,本文通过图文并茂实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java Swing组件BoxLayout布局用法示例

    Java Swing组件BoxLayout布局用法示例

    这篇文章主要介绍了Java Swing组件BoxLayout布局用法,结合实例形式分析了Swing使用BoxLayout容器进行布局的相关方法与操作技巧,需要的朋友可以参考下
    2017-11-11
  • idea解决springboot中的依赖版本冲突问题

    idea解决springboot中的依赖版本冲突问题

    这篇文章主要介绍了idea解决springboot中的依赖版本冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论