Android基于OkHttp实现文件上传功能

2022-07-27 09:50:27

本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下

一、相关概述

    Android请求访问服务端大多数情况下依旧是使用http协议,故而可以参照web端的数据传输形式来实现。multipart/form-data是浏览器提交表单上传文件的一种方式。有关于http的get,post请求大家可以自行百度了解。OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

    二、简单使用

    1:添加依赖

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.squareup.okio:okio:1.12.0'

    2:编写UploadUtil类

    package com.example.clientapplication.utils;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
     
    import okhttp3.MediaType;
    import okhttp3.MultipartBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.ResponseBody;
     
    public class UploadUtil {
        private OkHttpClient okHttpClient;
        private UploadUtil(){
            okHttpClient = new OkHttpClient();
        }
        /**
         * 使用静态内部类的方式实现单例模式
         */
        private static class UploadUtilInstance{
            private static final UploadUtil INSTANCE = new UploadUtil();
        }
        public static UploadUtil getInstance(){
            return UploadUtilInstance.INSTANCE;
        }
     
        /**
         * @param url   服务器地址
         * @param file  所要上传的文件
         * @return      响应结果
         * @throws IOException
         */
        public ResponseBody upload(String url, File file) throws IOException {
            OkHttpClient client = new OkHttpClient();
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("file", file.getName(),
                            RequestBody.create(MediaType.parse("multipart/form-data"), file))
                    .build();
            Request request = new Request.Builder()
                    .header("Authorization", "ClientID" + UUID.randomUUID())
                    .url(url)
                    .post(requestBody)
                    .build();
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
            return response.body();
        }
    }

    3:使用Util完成文件上传

    /**
         * 创建线程实现文件的上传
         * @param view
         */
        public void upload(View view){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        UploadUtil.getInstance().upload(path,file);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    三、注意事项

    在文件上传时我用的是利用Intent获取所选文件的Uri,使用了大佬的RealPathFromUriUtils工具类,get到文件的path,然后实例化了File作为参数使用upload方法。

    在定义UploadUtil时我使用了单例模式,在保证线程安全的前提下节省资源,提升服务器访问速率。觉得麻烦的可以不使用单例。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。