前言

  此篇博客只是上传功能的记录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. axios的介绍及使用

    特点:支持promise API . 拦截请求和响应.转换请求数据和响应数据.取消请求.自动转换JSON数据.客户端支持防御XSRF等: axios请求方法(需后端定义):get获取数据. post提 ...

  2. position:relative/static/fixed/absolute定位的区别以及使用场景

    absolute是相对于自己最近的父元素来定位的,relative是相对于自己来定位的 relative 不脱离文档流,absolute 脱离文档流.也就是说:relative 的元素尽管表面上看到它 ...

  3. Xcode使用篇-重新安装Xcode

    卸载Xcode sudo rm -rf /Applications/Xcode.app sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plis ...

  4. log4cplus TimeBasedRollingFileAppender

    参考自:http://blog.csdn.net/u010607621/article/details/54944696 对于TimeBasedRollingFileAppender 这个日志appe ...

  5. eclipse创建MAVEN项目是出现Could not resolve archetype的解决办法

    eclipse第一次创建MAVEN项目时出现这个问题,查了很多文档改了没用,后来问了别人知道是maven中央仓库下载插件包失败就会报错. 解决办法: 用国内阿里云镜像会好很多 在settings.xm ...

  6. Spring Cloud (Spring Cloud Stream)解析

    执行脚本目录 /bin windows 在其单独的目录 快速上手 下载并且解压kafka压缩包 运行服务 以Windows为例,首先打开cmd: 1.  启动zookeeper: bin\window ...

  7. python编程学习day03

    1.文件操作 (1)打开文件 f = open ("文件名称",mode='' ",encoding="utf-8") mode=操作方式 encod ...

  8. Change myself to be better

    发现和改变自己不好的习惯 遇到问题的反应 自己遇到问题的时候,特别是不熟悉的问题的时候就会有点焦虑,这个应该是每个人都会有的,遇到自己不熟悉的或者是没有经历过的东西都会 感觉不舒服,或者是遇到难题或者 ...

  9. JAVA jar命令(一)-jar打包class文件

    jar包本质上是将所有class文件.资源文件压缩打成一个包(也可以选择不压缩),可选择在jar包中生成META-INF/MANIFEST.MF文件,MANIFEST.MF是清单文件,里面可以记录主类 ...

  10. Android SDK 环境变量配置

    ANDROID_HOME = D:\Package\android-sdk-windows 在path 中加入 %ANDROID_HOME%\tools 和 %ANDROID_HOME%\platfo ...