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

2022-07-27 09:42:53

本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下一、相关概述Android请求访问服务端大多数情况下依旧是使用http协议,故而可以参照web端的数据...

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

一、相关概述

Android请求访问服务端大多数情cGIpus况下依旧是使用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("Authojsrization", "ClientID" + UUID.randomUUID())
        .url(url)
        .post(requestBody)
        .www.cppcns.combuild();
    Response response = client.newCall(request).execute();
    if (!response.isSucccGIpusessful())
      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时我使用了单例模式,在保证线程安全的前提下节省资源,提升服务器访问速率。觉得麻烦的可以不使用单例。

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