前言

  此篇博客只是上传功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html

代码部分

package okhttpdemo.com.libs.net.httpBase;

import android.util.Log;

import org.json.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Map;
import java.util.Set; import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttpdemo.com.libs.net.httpBase.listener.HttpUpListener;
import okio.BufferedSink; public class OkHttpUpUtil {
private static final String TAG = "OkHttpUpUtil";
private String mUpUrl;
private File mPath;
private Call mCall;
private Map<String,String> mParams;
private long mAlreadyUpLength = 0;//已经上传长度
private long mTotalLength = 0;//整体文件大小
private int mSign = 0;
private HttpUpListener mHttpUpListener; /**
* post上传
* @param upUrl
* @param upFilePathAndName
* @param params
* @param listener
*/
public void postUpRequest(final String upUrl, final File upFilePathAndName, final Map<String,String> params, final HttpUpListener listener){
synchronized (this) {
new Thread(new Runnable() {
@Override
public void run() {
mSign = 1;
mUpUrl = upUrl;
mPath = upFilePathAndName;
mParams = params;
mHttpUpListener = listener;
mAlreadyUpLength = 0;
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return null;
} @Override
public void writeTo(BufferedSink sink) throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile(mPath, "rw");
if (mTotalLength == 0) {
mTotalLength = randomAccessFile.length();
}
byte[] bytes = new byte[2048];
int len = 0;
try {
while ((len = randomAccessFile.read(bytes)) != -1) {
sink.write(bytes, 0, len);
mAlreadyUpLength = mAlreadyUpLength + len;
if (mHttpUpListener != null) {
mHttpUpListener.onUpFile(mTotalLength, mAlreadyUpLength);
}
}
}catch (Exception e){
Log.e(TAG, "上传中断");
}finally {
randomAccessFile.close();//关闭流
Log.e(TAG, "流关闭");
} }
};
// MultipartBody multipartBody = new MultipartBody.Builder()
// .addPart(changeJSON(mJson))
// .addFormDataPart("file",mPath.getName(),requestBody)
// .build();
MultipartBody.Builder builder = new MultipartBody.Builder();
if (mParams!=null) {
Set<String> keys = mParams.keySet();
for (String key : keys) {
builder.addFormDataPart(key, mParams.get(key));
}
}
builder.addFormDataPart("file", mPath.getName(), requestBody);
MultipartBody multipartBody = builder.build(); Request request = new Request.Builder()
.url(mUpUrl)
.post(multipartBody)
.build();
mCall = OkHttpClientCreate.CreateClient().newCall(request);
mCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (mHttpUpListener != null) {
mHttpUpListener.onFailure(call, e);
}
} @Override
public void onResponse(Call call, Response response) throws IOException {
if (mHttpUpListener != null) {
mHttpUpListener.onResponse(call, response);
} }
}); }
}).start();
} } /**
* post断点上传
* @param upUrl
* @param upFilePathAndName
* @param params
* @param listener
*/
public void postRenewalUpRequest(final String upUrl, final File upFilePathAndName, final Map<String,String> params, final HttpUpListener listener){
synchronized (this){
new Thread(new Runnable() {
@Override
public void run() {
mSign = 2;
mUpUrl = upUrl;
mPath = upFilePathAndName;
mParams = params;
mHttpUpListener = listener;
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return null;
} @Override
public void writeTo(BufferedSink sink) throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile(mPath, "rw");
if (mTotalLength == 0) {
mTotalLength = randomAccessFile.length();
}
if (mAlreadyUpLength != 0){
randomAccessFile.seek(mAlreadyUpLength);
}
byte[] bytes = new byte[2048];
int len = 0;
try {
while ((len = randomAccessFile.read(bytes)) != -1) {
sink.write(bytes, 0, len);
mAlreadyUpLength = mAlreadyUpLength + len;
if (mHttpUpListener != null) {
mHttpUpListener.onUpFile(mTotalLength, mAlreadyUpLength);
}
}
}catch (Exception e){
Log.e(TAG, "上传中断");
}finally {
mAlreadyUpLength = randomAccessFile.getFilePointer();
randomAccessFile.close();//关闭流
Log.e(TAG, "流关闭");
} }
}; MultipartBody.Builder builder = new MultipartBody.Builder();
if (mParams!=null) {
Set<String> keys = mParams.keySet();
for (String key : keys) {
builder.addFormDataPart(key, mParams.get(key));
}
}
builder.addFormDataPart("file", mPath.getName(), requestBody);
MultipartBody multipartBody = builder.build(); Request request = new Request.Builder()
.url(mUpUrl)
.header("RANGE","bytes="+mAlreadyUpLength+"-"+mTotalLength)
.post(multipartBody)
.build();
mCall = OkHttpClientCreate.CreateClient().newCall(request);
mCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (mHttpUpListener != null) {
mHttpUpListener.onFailure(call, e);
}
} @Override
public void onResponse(Call call, Response response) throws IOException {
if (mHttpUpListener != null) {
mHttpUpListener.onResponse(call, response);
}
mAlreadyUpLength = 0;
mTotalLength = 0; }
}); }
}).start();
} } /**
* 恢复上传
*/
public void resume(){
if (mSign==0){
return;
}
switch (mSign){
case 1:
postUpRequest(mUpUrl,mPath,mParams,mHttpUpListener);
break;
case 2:
postRenewalUpRequest(mUpUrl,mPath,mParams,mHttpUpListener);
break;
case 3: break;
case 4: break;
default:
break;
} } /**
* 暂停上传
*/
public void stop(){
if (mCall!=null){
mCall.cancel();
} } /**
* 删除上传路径文件
*/
public void deleteCurrentFile(){
if (mPath == null){
Log.e(TAG, "deleteCurrentFile error : 没有路径");
return;
}
if (!mPath.exists()){
Log.e(TAG, "deleteCurrentFile error: 文件不存在");
return;
}
mPath.delete();
mAlreadyUpLength = 0;
mTotalLength = 0;
mSign = 0;
} /**
* 销毁
*/
public void destroy(){
if (mCall!=null){
mCall.cancel();
mCall = null;
}
mSign = 0;
mHttpUpListener = null;
mPath = null;
mHttpUpListener = null;
mAlreadyUpLength = 0;
mTotalLength = 0;
} /**
* 转换Json参数为RequestBody
* @param jsonParam json对象
* @return RequestBody
*/
private RequestBody changeJSON(JSONObject jsonParam){
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8")
, String.valueOf(jsonParam));
return requestBody;
} }

Android 开发 框架系列 OkHttp文件上传功能实现(含断点续传)的更多相关文章

  1. Android 开发 框架系列 OkHttp拦截器

    前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...

  2. Android 开发 框架系列 OkHttp使用详解

    简介 okhttp是一个第三方类库,用于android中请求网络.这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) . ...

  3. Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)

    前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  4. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. Android 开发 框架系列 Google的ORM框架 Room

    目录 简介 导入工程 使用流程概况 一个简单的小Demo 深入学习 @Entity使用 自定义表名 tableName  自定义字段名@ColumnInfo 主键 @PrimaryKey 索引 @In ...

  6. android 开发 框架系列 使用 FileDownloader 实现检查更新的功能class

    首先介绍一下FileDownloader GH :https://github.com/lingochamp/FileDownloader/blob/master/README-zh.md FileD ...

  7. Android 开发 框架系列 百度语音合成

    官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://cloud.baidu.com/product/ ...

  8. Android 开发 框架系列 EventBus 事件总线

    介绍 GitHub:https://github.com/greenrobot/EventBus 先聊聊EventBus 线程总线是干什么的,使用环境,优点.缺点. 干什么的? 一句话,简单统一数据传 ...

  9. Android 开发 框架系列 glide-transformations 图片处理基本使用

    首先简单的介绍一下Gilde作用范围.Gilde功能十分强大,它可以实现图片处理.图片本地加载.图片网络加载.位图加载.图片内存缓存.图片磁盘缓存.Gif图片加载.使用简单轻松,轻松的后是它强大的心, ...

随机推荐

  1. 进程共享变量#pragma data_seg用法

    #pragma data_seg介绍 用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为: #pragma data_seg ("shareddata" ...

  2. HTML中<frameset>标签不显示的问题

    啥都不说,先上代码 <html> <head> <title>index</title> <meta content = 'text/html'; ...

  3. 使用ProxyBroker构建代理池

    import asyncio from proxybroker import Broker async def show(proxies): while True: proxy = await pro ...

  4. springcloud中config启动时候报错Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"

    -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jm ...

  5. Tomcat7安装和配置以及优化

    安装Tomcat7 下载安装方法一: 直接下载Tomcat7: wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0 ...

  6. pandas读书笔记、重新索引

      重新索引   pandas对象的一个重要方法是 reindex ,其作用是创建一个适应新索引的新对象. #reindex函数的参数 reindex(index,method,fill_value, ...

  7. line-height 行高的使用

    line-height:normal; 默认  字体 line-height:1.5; line-height:200%; line-height:50px;  ps : 固定的值 line-heig ...

  8. 欧拉定理、欧拉函数、a/b%c

    怕忘了…… 欧拉函数 定义.证明.打表方法 欧拉定理 定义.证明 https://blog.csdn.net/zzkksunboy/article/details/73061013 剩余系.完系.简系 ...

  9. JAVA 调用c++ 扩展 批评那些垃圾,

    //本人喜欢用命令行的方式,这样好理解原理 { 1 生成的要是X64 并且是release版本 不要预编译头的dll项目,就是创建的时是一个空dll项目 2 java 调用时要import com.m ...

  10. Dart编程数据类型

    编程语言最基本的特征之一是它支持的数据类型集.这些是可以用编程语言表示和操作的值的类型. Dart语言支持以下类型 数字 字符串 布尔 列表list map 数字 Dart中的数字用于表示数字文字.D ...