Android 开发 框架系列 OkHttp文件上传功能实现(含断点续传)
前言
此篇博客只是上传功能的记录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文件上传功能实现(含断点续传)的更多相关文章
- Android 开发 框架系列 OkHttp拦截器
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...
- Android 开发 框架系列 OkHttp使用详解
简介 okhttp是一个第三方类库,用于android中请求网络.这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) . ...
- Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)
前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...
- 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- Android 开发 框架系列 Google的ORM框架 Room
目录 简介 导入工程 使用流程概况 一个简单的小Demo 深入学习 @Entity使用 自定义表名 tableName 自定义字段名@ColumnInfo 主键 @PrimaryKey 索引 @In ...
- android 开发 框架系列 使用 FileDownloader 实现检查更新的功能class
首先介绍一下FileDownloader GH :https://github.com/lingochamp/FileDownloader/blob/master/README-zh.md FileD ...
- Android 开发 框架系列 百度语音合成
官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://cloud.baidu.com/product/ ...
- Android 开发 框架系列 EventBus 事件总线
介绍 GitHub:https://github.com/greenrobot/EventBus 先聊聊EventBus 线程总线是干什么的,使用环境,优点.缺点. 干什么的? 一句话,简单统一数据传 ...
- Android 开发 框架系列 glide-transformations 图片处理基本使用
首先简单的介绍一下Gilde作用范围.Gilde功能十分强大,它可以实现图片处理.图片本地加载.图片网络加载.位图加载.图片内存缓存.图片磁盘缓存.Gif图片加载.使用简单轻松,轻松的后是它强大的心, ...
随机推荐
- 洛谷 P2652 同花顺(离散化)
洛谷 P2652 同花顺(题面) 手动模拟了一下,其实离散化排序可以起很大作用题目要求花色相同,数字连续,那么我们要做的就是找一种花色,并提取出其中一串数字留下那些舍弃的牌换成相应花色,并和之前留下的 ...
- Django(九) xadmin全局配置
xadmin的使用,首先需要对model进行注册,才能在后台管理中进行操作. 1.在app里创建py文件:adminx(必须这个名称) 2.导入xadmin和models里的类,格式如下: 其中lis ...
- win10命令行kill进程
1. 查:netstat -ano | findstr "8080" 2. 杀:taskkill -PID 8082 -F
- vue中beforeRouteEnter 执行的时机及运用的误区?
beforeRouteEnter钩子 beforeRouteEnter (to, from, next) { console.log(this); //undefined,不能用this来获取vue实 ...
- python--hmac
检测一下客户端是否合法,不依靠登录认证.这样即使知道服务端ip和端口,客户端也不能随便就连接服务端实现机制是在服务端中设置了密钥,借用了hmac os 两个模块 import socket impor ...
- C语言结构体注意点
#include <stdio.h> int main() { /*************************************************** *定义结构体变量的 ...
- C语言清空指针
#include <stdio.h> int main() { /********************************************* * * %d int * %f ...
- H5新增input表单、表单属性
新增表单 email,Email类型 url , Url类型 date,日期类型 time,时间类型 month,月类型 week,周类型 number,数字类型 tel,电话类型 search,搜索 ...
- Linux 进程间通信 有名管道(fifo)
有名管道特点: 1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围 2)有名管道可以使互不相关的两个进程互相通信. 3)有名管道可以通过路径名来指出,并且在文件系统中可见,但内容 ...
- Python 分解质因数
def zys(n, value=[]): for i in range(2, int(n / 2 + 1)): if n % i == 0: value.append(i) zys(n / i, v ...