此篇博客只是上傳功能的記錄demo,若是你還不太瞭解okhttp能夠參考個人另外一篇博客http://www.javashuo.com/article/p-eoxgslqg-dv.htmlhtml
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; } }