OkHttp3 MultipartBodyjs 限制上传文件数量量是否有限制?

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
使用MultipartBody来给服务器上传文件,有谁知道通过addFormDataPart()方法来添加上传文件,一次Request最多能上传几个文件,或者是最多一次能上传多大的文件。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
虽然限制我不太清楚,可以把我使用的情况说一下,我最多一次上传过6个文件,每个都在2M左右,除了使用家用WIFI,上传速度太慢外,其他情况没有遇到太多的问题。
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:Android OkHttp Post上传文件并且携带参数实例详解
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android OkHttp Post上传文件并且携带参数实例详解的相关资料,需要的朋友可以参考下
Android OkHttp Post上传文件并且携带参数
这里整理一下 OkHttp 的 post 在上传文件的同时,也要携带请求参数的方法。
使用 OkHttp 版本如下:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
代码如下:
protected void post_file(final String url, final Map&String, Object& map, File file) {
OkHttpClient client = new OkHttpClient();
// form 表单形式上传
MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
if(file != null){
// MediaType.parse() 里面是上传的文件类型。
RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);
String filename = file.getName();
// 参数分别为, 请求key ,文件名称 , RequestBody
requestBody.addFormDataPart("headImage", file.getName(), body);
if (map != null) {
// map 里面是请求中所需要的 key 和 value
for (Map.Entry entry : map.entrySet()) {
requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));
Request request = new Request.Builder().url("请求地址").post(requestBody.build()).tag(context).build();
// readTimeout("请求超时时间" , 时间单位);
client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
Log.i("lfq" ,"onFailure");
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String str = response.body().string();
Log.i("lfq", response.message() + " , body " + str);
Log.i("lfq" ,response.message() + " error : body " + response.body().string());
这里说明一点,就是 MultipartBody.Builder 的 addFormDataPart 方法,是对于之前的 addPart 方法做了一个封装,所以,不需要再去配置 Header 之类的。
如果只是单纯的 Post 携带参数,那么直接使用 FormBody ,代码如下:
FormBody.Builder formBody = new FormBody.Builder();
if (map != null) {
for (Map.Entry entry : map.entrySet()) {
formBody.add(String.valueOf(entry.getKey()),String.valueOf(entry.getValue()));
以上只是针对项目中遇到的问题进行整理,需要了解更多,请自行查阅大神们的解析。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具OkHttp学习(3)--))同步、异步之上传文件至服务器(重写RequestBody方法,实现上传进度接口回调)
此篇博客,我们通过2种方式来了解下okhttp的文件上传至服务器
ps一下,还有一种就是添加params参数,生成post提交时的分块request(这里就不列出实例效果了,但是封装代码博文后附加)
还有一种就是添加params参数,生成post提交时的分块request
在说明同步、异步上传代码前,我们先来了解下上传图片文件的大概思路:
我这里贴出一个截图,就很简单明了了,截图如下:
截图的意思就是将图片压缩成byte[]字节数组,然后通过Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT)将字节数组,转为64位的字符串,然后在封装请求体,传给服务器即可
了解完上传图片文件的大概思路后, 我们来看下我们代码是如何实现的?
我公司请求是用的https,我这个例子,就没有去https认证证书,我就直接https 不验证证书方式(信任所有证书)
在SaflyApplication中进行如下代码设置:vcD4NCjxwcmUgY2xhc3M9"brush:">
public static OkHttpClient getUnsafeOkHttpClient() {
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
final SSLContext sslContext = SSLContext.getInstance(&SSL&);
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
OkHttpClient okHttpClient = builder.connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();
return okHttpC
} catch (Exception e) {
throw new RuntimeException(e);
楼上的代码,也是我找的度娘搜索的,下面这段代码就初始化了一个OkHttpClient对象,设置了连接时间,读取时间等信息
OkHttpClient okHttpClient = builder.connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();
我们在OkHttpManger进行
private Handler okHttpH
private OkHttpClient mOkHttpC
private OkHttpManger(){
this.mOkHttpClient = SaflyApplication.getInstance().getUnsafeOkHttpClient();
this.okHttpHandler = new Handler(Looper.getMainLooper());
public static final OkHttpManger getInstance(){
return SingleFactory.
private static final class SingleFactory{
private static final OkHttpManger manger = new OkHttpManger();
构造一个单利模式,然后为了线程之间通讯,我们还初始化了一个handler,用来进行ui线程的页面更新操作
我们先来看看同步上传头像代码
Response response =
OkHttpManger.getInstance().postSyncJson(&https://10.0.5.48:7771/SetVPHUserInfo&, Json);
public Response postSyncJson(String url, String json) throws IOException {
final RequestBody requestBody = RequestBody.create(JSON_TYPE, json);
final Request request = new Request.Builder().url(url).post(requestBody).build();
return mOkHttpClient.newCall(request).execute();
本例中我构造json字符串是用的JSONObject的方式,
如果对如何构建Json字符串还不是很明白的,可以看我如下的博客文章:
另外还有一种方式,就是自定义拼接的方式(我公司就是用的这样的方法,这里就不赘述了)
针对本例的上传服务端的json格式,我们用JSONObject如下方法即可生成所需要的json字符串
private String createJson() throws JSONException {
JSONObject jsonObject = new JSONObject();
JSONObject body = new JSONObject();
body.put(&photo_type&, &jpeg&);
body.put(&nickname&, &hehe&);
body.put(&context&, Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT));
JSONObject head = new JSONObject();
head.put(&godin_id&, &0e6ad2a71e31752deb69d6e8c9eabe76&);
head.put(&app_type&, &3&);
head.put(&os_type&, &android&);
JSONObject Request = new JSONObject();
Request.put(&body&, body);
Request.put(&head&, head);
jsonObject.put(&Request&, Request);
return jsonObject.toString();
然后在response.isSuccessful()进行判断返回结果就可以了
由于我是直接访问的公司上传头像的接口,godin_id字段是写死的,服务端没有注册的记录,所以就返回auth error的错误,不过我问了服务端的同事,已经收到该请求,通讯成功
我们在来看看异步上传头像代码
OkHttpManger.getInstance().postAsyncJsonn(&https://10.0.5.48:7771/SetVPHUserInfo&, Json, new OkHttpManger.MyCallback()
public void postAsyncJsonn(String url, String json, MyCallback mCallback) throws IOException {
final RequestBody requestBody = RequestBody.create(JSON_TYPE, json);
final Request request = new Request.Builder().url(url).post(requestBody).build();
deliveryResult(mOkHttpClient.newCall(request),mCallback);
然后进行接口回调
private void deliveryResult(final Call call, final MyCallback mCallback) {
call.enqueue(new Callback() {
public void onFailure(final Call call, final IOException e) {
okHttpHandler.post(new Runnable() {
public void run() {
if (mCallback != null) {
mCallback.onFailture();
public void onResponse(Call call, final Response response) throws IOException {
final String responseStr = response.body().string();
okHttpHandler.post(new Runnable() {
public void run() {
if (mCallback != null) {
mCallback.onSuccess(responseStr);
然后截图是一样的,也是可以通讯成功的。
以上就是同步、异步2种方式,上传头像至服务器
接下来我们看看另外一个方式,不过这个方法我没有去实践代码,不过有代码封装,以下就是代码
* 同步基于post的文件上传
* @param url 地址
* @param files 提交的文件数组
* @param fileKeys 提交的文件数组key
* @param params 提交的键值对
* @return Response
public Response uploadSync(String url, File[] files, String[] fileKeys, Param[] params) throws IOException {
final RequestBody requestBody = buildMultipartFormRequestBody(files, fileKeys, params);
final Request request = new Request.Builder().url(url).post(requestBody).build();
return mOkHttpClient.newCall(request).execute();
* 异步基于post的文件上传,回传上传进度
* @param url 地址
* @param files 提交的文件数组
* @param fileKeys 提交的文件数组key
* @param params 提交的键值对
public void uploadAsync(String url, File[] files, String[] fileKeys,
final OKHttpUICallback.ProgressCallback uploadListener, Param[] params) throws IOException {
final RequestBody requestBody = buildMultipartFormRequestBody(files, fileKeys, params);
final Request request = new Request.Builder().url(url).post(new ProgressBody.ProgressRequestBody(requestBody, uploadListener, okHttpHandler)).build();
mOkHttpClient.newCall(request).enqueue(new OKHttpThreadCallback(okHttpHandler, uploadListener, false));
生成post提交时的分块request
private RequestBody buildMultipartFormRequestBody(File[] files, String[] fileKeys, Param[] params){
if(params == null){
params = new Param[0];
MultipartBody.Builder builder = new MultipartBody.Builder();
for(Param param:params){
builder.addPart(Headers.of(&Content-Disposition&, &form- name=\&& + param.key + &\&&),
RequestBody.create(null, param.value));
if(files == null){
files = new File[0];
if(fileKeys == null){
fileKeys = new String[0];
if(fileKeys.length != files.length){
throw new ArrayStoreException(&fileKeys.length != files.length&);
RequestBody fileBody =
int length = files.
for(int i = 0;i
我们重点来看看ProgressBody.ProgressRequestBody的代码 Okio中有两个关键的接口,Sink和Source,这两个接口都继承了Closeable接口;而Sink可以简单的看做OutputStream,Source可以简单的看做InputStream。而这两个接口都是支持读写超时设置的。 它们各自有一个支持缓冲区的子类接口,BufferedSink和BufferedSource,而BufferedSink有一个实现类RealBufferedSink,BufferedSource有一个实现类RealBufferedSource
if(bufferedSink == null){
//开始包装
bufferedSink = Okio.buffer(sink(sink));
requestBody.writeTo(bufferedSink);
bufferedSink.flush();
然后在发布进度
private Sink sink(Sink sink){
return new ForwardingSink(sink) {
//当前写入字节数
long byteWriteed = 0L;
//总得字节数
long contentBytes = 0L;
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
if(mHandler != null && mListener != null){
if(contentBytes == 0L){
contentBytes = contentLength();
byteWriteed += byteC
mListener.onProgress(byteWriteed, contentBytes, byteWriteed == contentBytes);
mOkHttpClient.newCall(request).enqueue(new OKHttpThreadCallback(okHttpHandler, uploadListener, false));
在成功回调的接口中,进行如下操作
public void onResponse(Call call, Response response) throws IOException {
if(isDownload){
download(call,response);
postSuccess(call,response);
private void postSuccess(final Call call, final Response response){
if(UICallback != null && UIHandler != null){
UIHandler.post(new Runnable() {
public void run() {
UICallback.onSuccess(call, response,downFile == null?null:downFile.getAbsolutePath());
然后在主界面在进行接口回调,去实现其他一些操作
///////////////以下是代码////////////////////以下是代码/////////////////以下是代码/////////////////////
MainActivity
package com.example.administrator.
import android.app.A
import android.content.res.R
import android.graphics.B
import android.graphics.BitmapF
import android.os.B
import android.util.Base64;
import android.util.L
import android.view.V
import android.widget.B
import android.widget.ImageV
import org.json.JSONE
import org.json.JSONO
import java.io.ByteArrayOutputS
import java.io.IOE
import okhttp3.R
public class MainActivity extends Activity implements View.OnClickListener {
Button uploadSync,uploadA
private String responseS
private byte[] bitmap2B
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uploadSync = (Button) findViewById(R.id.uploadSync);
uploadAsync = (Button) findViewById(R.id.uploadAsync);
uploadSync.setOnClickListener(this);
uploadAsync.setOnClickListener(this);
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.mipmap.ic_launcher);
bitmap2Bytes = Bitmap2Bytes(bmp);
public byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.pressFormat.PNG, 100, baos);
return baos.toByteArray();
public void onClick(View v) {
switch (v.getId()){
case R.id.uploadSync:
Json = createJson();
Log.i(&MainActivity&,&postSyncByParams2 Json:&+Json);
} catch (JSONException e) {
e.printStackTrace();
new Thread() {
public void run() {
Response response =
OkHttpManger.getInstance().postSyncJson(&https://10.0.5.48:7771/SetVPHUserInfo&, Json);
if (response.isSuccessful()){
responseStr = response.body().string();
Log.i(&MainActivity&,&postSyncByParams2:&+responseStr);
Log.i(&MainActivity&,&postSyncByParams2 error&);
} catch (IOException e) {
e.printStackTrace();
}.start();
case R.id.uploadAsync:
Json = createJson();
Log.i(&MainActivity&,&postSyncByParams2 Json:&+Json);
} catch (JSONException e) {
e.printStackTrace();
OkHttpManger.getInstance().postAsyncJsonn(&https://10.0.5.48:7771/SetVPHUserInfo&, Json, new OkHttpManger.MyCallback() {
public void onSuccess(String result) {
Log.i(&MainActivity&,&result----&+result);
public void onFailture() {
} catch (IOException e) {
e.printStackTrace();
String Json =
private String createJson() throws JSONException {
JSONObject jsonObject = new JSONObject();
JSONObject body = new JSONObject();
body.put(&photo_type&, &jpeg&);
body.put(&nickname&, &hehe&);
body.put(&context&, Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT));
JSONObject head = new JSONObject();
head.put(&godin_id&, &0e6ad2a71e31752deb69d6e8c9eabe76&);
head.put(&app_type&, &3&);
head.put(&os_type&, &android&);
JSONObject Request = new JSONObject();
Request.put(&body&, body);
Request.put(&head&, head);
jsonObject.put(&Request&, Request);
return jsonObject.toString();
SaflyApplication
package com.example.administrator.
import android.app.A
import java.util.concurrent.TimeU
import javax.net.ssl.HostnameV
import javax.net.ssl.SSLC
import javax.net.ssl.SSLS
import javax.net.ssl.TrustM
import javax.net.ssl.X509TrustM
import okhttp3.OkHttpC
public class SaflyApplication extends Application {
private static SaflyA
public void onCreate() {
super.onCreate();
this.instance =
public static SaflyApplication getInstance() {
public static OkHttpClient getUnsafeOkHttpClient() {
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
final SSLContext sslContext = SSLContext.getInstance(&SSL&);
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
OkHttpClient okHttpClient = builder.connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();
return okHttpC
} catch (Exception e) {
throw new RuntimeException(e);
OkHttpManger
package com.example.administrator.
import android.os.H
import android.os.L
import android.util.L
import com.alibaba.fastjson.JSON;
import java.io.F
import java.io.IOE
import java.net.FileNameM
import java.net.URLC
import java.util.HashM
import java.util.M
import java.util.S
import java.util.concurrent.TimeU
import okhttp3.C
import okhttp3.C
import okhttp3.FormB
import okhttp3.H
import okhttp3.I
import okhttp3.MediaT
import okhttp3.MultipartB
import okhttp3.OkHttpC
import okhttp3.R
import okhttp3.RequestB
import okhttp3.R
* OkHttp 工具类,
* get的同步异步请求
* post的json字符串同步异步上传
* post的键值对同步异步上传
* post文件异步上传,回调结果以及进度
* 异步下载文件,回调结果以及进度
* Created by Seeker on .
public final class OkHttpManger {
private static final String TAG = &OkHttpManger&;
private static final MediaType JSON_TYPE = MediaType.parse(&application/ charset=utf-8&);
private Handler okHttpH
private OkHttpClient mOkHttpC
private OkHttpManger(){
this.mOkHttpClient = SaflyApplication.getInstance().getUnsafeOkHttpClient();
this.okHttpHandler = new Handler(Looper.getMainLooper());
public static final OkHttpManger getInstance(){
return SingleFactory.
private static final class SingleFactory{
private static final OkHttpManger manger = new OkHttpManger();
/////////////////////////同步异步上传头像//////////////////////////////
interface MyCallback{
void onSuccess(String result);
void onFailture();
public Response postSyncJson(String url, String json) throws IOException {
final RequestBody requestBody = RequestBody.create(JSON_TYPE, json);
final Request request = new Request.Builder().url(url).post(requestBody).build();
return mOkHttpClient.newCall(request).execute();
public void postAsyncJsonn(String url, String json, MyCallback mCallback) throws IOException {
final RequestBody requestBody = RequestBody.create(JSON_TYPE, json);
final Request request = new Request.Builder().url(url).post(requestBody).build();
deliveryResult(mOkHttpClient.newCall(request),mCallback);
private void deliveryResult(final Call call, final MyCallback mCallback) {
call.enqueue(new Callback() {
public void onFailure(final Call call, final IOException e) {
okHttpHandler.post(new Runnable() {
public void run() {
if (mCallback != null) {
mCallback.onFailture();
public void onResponse(Call call, final Response response) throws IOException {
final String responseStr = response.body().string();
okHttpHandler.post(new Runnable() {
public void run() {
if (mCallback != null) {
mCallback.onSuccess(responseStr);
////////////////////////同步异步上传头像//////////////////////////////
* 同步基于post的文件上传
* @param url 地址
* @param file 提交的文件
* @param fileKey 提交的文件key
* @return Response
public Response uploadSync(String url, File file, String fileKey) throws IOException {
return uploadSync(url, new File[]{file}, new String[]{fileKey}, new Param[0]);
* 同步基于post的文件上传
* @param url 地址
* @param files 提交的文件数组
* @param fileKeys 提交的文件数组key
* @param params 提交的键值对
* @return Response
public Response uploadSync(String url, File[] files, String[] fileKeys, Param[] params) throws IOException {
final RequestBody requestBody = buildMultipartFormRequestBody(files, fileKeys, params);
final Request request = new Request.Builder().url(url).post(requestBody).build();
return mOkHttpClient.newCall(request).execute();
* 异步基于post的文件上传,回传上传进度
* @param url 地址
* @param file 提交的文件
* @param fileKey 提交的文件key
public void uploadAsync(String url, File file, String fileKey, OKHttpUICallback.ProgressCallback listener)
throws IOException {
uploadAsync(url, new File[]{file}, new String[]{fileKey}, listener, new Param[0]);
* 异步基于post的文件上传,回传上传进度
* @param url 地址
* @param files 提交的文件数组
* @param fileKeys 提交的文件数组key
* @param params 提交的键值对
public void uploadAsync(String url, File[] files, String[] fileKeys,
final OKHttpUICallback.ProgressCallback uploadListener, Param[] params) throws IOException {
final RequestBody requestBody = buildMultipartFormRequestBody(files, fileKeys, params);
final Request request = new Request.Builder().url(url).post(new ProgressBody.ProgressRequestBody(requestBody, uploadListener, okHttpHandler)).build();
mOkHttpClient.newCall(request).enqueue(new OKHttpThreadCallback(okHttpHandler, uploadListener, false));
* 生成post提交时的分块request
* @param files
* @param fileKeys
* @param params
private RequestBody buildMultipartFormRequestBody(File[] files, String[] fileKeys, Param[] params){
if(params == null){
params = new Param[0];
MultipartBody.Builder builder = new MultipartBody.Builder();
for(Param param:params){
builder.addPart(Headers.of(&Content-Disposition&, &form- name=\&& + param.key + &\&&),
RequestBody.create(null, param.value));
if(files == null){
files = new File[0];
if(fileKeys == null){
fileKeys = new String[0];
if(fileKeys.length != files.length){
throw new ArrayStoreException(&fileKeys.length != files.length&);
RequestBody fileBody =
int length = files.
for(int i = 0;i&i++){ contenttype=&& file=&& filebody=&RequestBody.create(MediaType.parse(guessMimeType(fileName)),file);& filename=&file.getName();& filenamemap=&& final=&& name=&\& pre=&& private=&& public=&& return=&& static=&& string=&& this.key=&& this.value=&& todo=&& type=&=&&
ProgressBody 上传的进度接口package com.example.administrator.
import android.os.H
import java.io.IOE
import okhttp3.MediaT
import okhttp3.RequestB
import okhttp3.ResponseB
import okio.B
import okio.BufferedS
import okio.BufferedS
import okio.ForwardingS
import okio.ForwardingS
import okio.O
import okio.S
import okio.S
* Created by Seeker on .
public final class ProgressBody {
* 包装响应体,用于处理提示上传进度
* Created by Seeker on .
public static final class ProgressRequestBody extends RequestBody {
//实际待包装的请求体
private final RequestBody requestB
//上传进度回调接口
private OKHttpUICallback.ProgressCallback mL
//包装完成的BufferedSink
private BufferedSink bufferedS
//传递下载进度到主线程
private Handler mH
public ProgressRequestBody(RequestBody requestBody, OKHttpUICallback.ProgressCallback listener, Handler handler){
this.requestBody = requestB
this.mListener =
this.mHandler =
public long contentLength() throws IOException {
return requestBody.contentLength();
public MediaType contentType() {
return requestBody.contentType();
public void writeTo(BufferedSink sink) throws IOException {
if(bufferedSink == null){
//开始包装
bufferedSink = Okio.buffer(sink(sink));
requestBody.writeTo(bufferedSink);
bufferedSink.flush();
* 写入,回调进度接口
private Sink sink(Sink sink){
return new ForwardingSink(sink) {
//当前写入字节数
long byteWriteed = 0L;
//总得字节数
long contentBytes = 0L;
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
if(mHandler != null && mListener != null){
if(contentBytes == 0L){
contentBytes = contentLength();
byteWriteed += byteC
mListener.onProgress(byteWriteed, contentBytes, byteWriteed == contentBytes);
OKHttpThreadCallback上传完毕后的接口方法package com.example.administrator.
import android.os.H
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import okhttp3.C
import okhttp3.C
import okhttp3.R
public final class OKHttpThreadCallback implements Callback {
private Handler UIH
private OKHttpUICallback.ProgressCallback UIC
private boolean isD
private File downF
public OKHttpThreadCallback(Handler handler, OKHttpUICallback.ProgressCallback callback, boolean isDownload){
this.UIHandler =
this.UICallback =
this.isDownload = isD
public void onFailure(final Call call, final IOException e) {
if(UICallback != null && UIHandler != null){
UIHandler.post(new Runnable() {
public void run() {
UICallback.onError(call,e);
public void onResponse(Call call, Response response) throws IOException {
if(isDownload){
download(call,response);
postSuccess(call,response);
* 设置保存file
* @param file
public OKHttpThreadCallback setFile(File file){
this.downFile =
* 获取下载数据并写入文件
* @param response
private void download(Call call, Response response) throws IOException {
if(downFile == null){
throw new NullPointerException("downFile == null");
byte[] buffer = new byte[2048];
InputStream is = response.body().byteStream();
FileOutputStream fos = new FileOutputStream(downFile);
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
fos.flush();
if(is != null){
is.close();
if (fos != null){
fos.close();
postSuccess(call,null);
* 回调成功信息
* @param call
* @param response
private void postSuccess(final Call call, final Response response){
if(UICallback != null && UIHandler != null){
UIHandler.post(new Runnable() {
public void run() {
UICallback.onSuccess(call, response,downFile == null?null:downFile.getAbsolutePath());
OKHttpUICallback成功后需要实现的接口定义类package com.example.administrator.
import java.io.IOE
import java.lang.reflect.ParameterizedT
import java.lang.reflect.T
import okhttp3.C
import okhttp3.R
* Created by safly on .
* 回调主线程的接口
public class OKHttpUICallback {
* 异步回调接口
* 带有进度的上传、下载回调接口
public interface ProgressCallback{
void onSuccess(Call call, Response response, String path);
void onProgress(long byteReadOrWrite, long contentLength, boolean done);
void onError(Call call, IOException e);

我要回帖

更多关于 文件数量超出限制 的文章

 

随机推荐