OkHttp实现文件上传进度
文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码
import com.squareup.okhttp.*;
import okio.Buffer;
import okio.BufferedSink;
import okio.Okio;
import okio.Source; import java.io.File;
import java.io.IOException; public class ProgressUploadFile {
private static final OkHttpClient okHttpClient = new OkHttpClient(); private void run() { MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM); File file = new File("D:\\file.jpg");
builder.addFormDataPart("file", file.getName(), createCustomRequestBody(MultipartBuilder.FORM, file, new ProgressListener() {
@Override public void onProgress(long totalBytes, long remainingBytes, boolean done) {
System.out.print((totalBytes - remainingBytes) * / totalBytes + "%");
}
})); RequestBody requestBody = builder.build(); Request request = new Request.Builder()
.url("http://localhost:8080/upload") //地址
.post(requestBody)
.build(); okHttpClient.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException {
System.out.println("response.body().string() = " + response.body().string()); }
});
} public static RequestBody createCustomRequestBody(final MediaType contentType, final File file, final ProgressListener listener) {
return new RequestBody() {
@Override public MediaType contentType() {
return contentType;
} @Override public long contentLength() {
return file.length();
} @Override public void writeTo(BufferedSink sink) throws IOException {
Source source;
try {
source = Okio.source(file);
//sink.writeAll(source);
Buffer buf = new Buffer();
Long remaining = contentLength();
for (long readCount; (readCount = source.read(buf, )) != -; ) {
sink.write(buf, readCount);
listener.onProgress(contentLength(), remaining -= readCount, remaining == ); }
} catch (Exception e) {
e.printStackTrace();
}
}
};
} interface ProgressListener {
void onProgress(long totalBytes, long remainingBytes, boolean done);
} public static void main(String[] args) {
new ProgressUploadFile().run(); } }
结果:
0%0%1%1%1%2%2%3%3%3%4%4%4%5%5%6%6%6%7%7%7%8%8%9%9%9%10%10%10%11%11%12%12%12%13%13%13%14%14%15%15%15%16%16%16%17%17%18%18%18%19%19%19%20%20%21%21%21%22%22%23%23%23%24%24%24%25%25%26%26%26%27%27%27%28%28%29%29%29%30%30%30%31%31%32%32%32%33%33%33%34%34%35%35%35%36%36%36%37%37%38%38%38%39%39%39%40%40%41%41%41%42%42%43%43%43%44%44%44%45%45%46%46%46%47%47%47%48%48%49%49%49%50%50%50%51%51%52%52%52%53%53%53%54%54%55%55%55%56%56%56%57%57%58%58%58%59%59%59%60%60%61%61%61%62%62%62%63%63%64%64%64%65%65%66%66%66%67%67%67%68%68%69%69%69%70%70%70%71%71%72%72%72%73%73%73%74%74%75%75%75%76%76%76%77%77%78%78%78%79%79%79%80%80%81%81%81%82%82%82%83%83%84%84%84%85%85%86%86%86%87%87%87%88%88%89%89%89%90%90%90%91%91%92%92%92%93%93%93%94%94%95%95%95%96%96%96%97%97%98%98%98%99%99%99%100%
response.body().string() = You successfully uploaded file.jpg !
Process finished with exit code 0
OkHttp实现文件上传进度的更多相关文章
- HTML5矢量实现文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- PHP中使用Session配合Javascript实现文件上传进度条功能
Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...
- Web---文件上传-用apache的工具处理、打散目录、简单文件上传进度
我们需要先准备好2个apache的类: 上一个博客文章只讲了最简单的入门,现在来开始慢慢加深. 先过渡一下:只上传一个file项 index.jsp: <h2>用apache的工具处理文件 ...
- Node.js:上传文件,服务端如何获取文件上传进度
内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...
- SpringMVC 监听文件上传进度
Spring MVC 监听文件上传进度 具体实现分三个步骤: 接管CommonsMultipartResolver,重写针对文件上传的请求. 在第一步中写入监听,以获取上传进度. 修改上传部分的配置文 ...
- iOS_文件上传进度条的实现思路-AFNettworking
iOS_文件上传进度条的实现思路-AFNettworking //要上传的文件名,在这里我使用当前日期做为文件的名称 NSString * fileName =[NSString stringWith ...
- asp.net文件上传进度条研究
文章:asp.net 文件上传进度条实现代码
- js获取文件上传进度
js获取文件上传进度: <input name="file" id="FileUpload" type="file" /> &l ...
随机推荐
- JavaSE-序列化和反序列化
什么是序列化,什么时候要进行序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输. 我们在对java对象进行IO流操作 ...
- 【从0到1学jQuery】jQuery中each()和$.each()的使用
引子: 最近遇到一个问题,就是在each()函数中怎么模拟for循环中的break和continue的操作.所以就查看了jQuery关于这个函数的文档,并且总结一下. 演示代码如下: <div& ...
- discuz 文件模板edit
1.修改title Power by discuz! 位置:template/default/common --->header_common.htm 2.discuz.htm 文件路径(修 ...
- vue子组件传参给父组件
关于父组件传参给子组件,可以看我另一篇文章 教程开始: 我们要实现的效果是:在子组件的Input框输入,父组件中实时更新显示.(也就是把子组件中的数据传给父组件) 一.子组件代码 template部分 ...
- NHibernate 有好几种数据库查询方式
NHibernate 有好几种数据库查询方式 1.原生SQL var employeeQuery = Database.Session .CreateSQLQuery("select * f ...
- [Golang] GOROOT、GOPATH和Project目录说明
go env环境查看 用go env 可查看当前go环境变量. $ go env GOARCH="amd64" GOBIN="" GOEXE="&qu ...
- Windows Mobile设备操作演示准备工作小记
公司最近为PDA开发了一款作业程序,我在工作中常常需要将操作过程通过电脑上设影出来为客户讲解使用方法.本文记录了相关的准备工作. 1. 微软嵌入式操作系统体系 RTOS: Embedded Real ...
- java日期互转:LocalDateTime、String、TimeStamp、Long、Instant、Date
由于java版本的迭代,一个使用java开发的项目中可能出现多种日期对象,例如LocalDateTime.LocalDate.Date,不像C#只有一个DateTime,因此在各种日期格式或者对象之间 ...
- SpringMVC融合Swagger UI使用
相信大家都很熟悉springmvc,在用其进行开发工作的时候,有没有遇到几个小问题?比如: 1.前后端分离的模式下,前端开发人员如何得知后端的开发进度,有哪些接口可用? 2.后端开发人员在测试自己的接 ...
- string类型与ASCII byte[]转换
1. string类型转成 ASCII byte[]: byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); 例:" ...