Android_Okhttp上傳與下載檔案
阿新 • • 發佈:2019-01-07
一:使用okhttp下載與上傳檔案
依賴
compile 'com.squareup.okhttp3:okhttp:3.9.1'
compile 'com.google.code.gson:gson:2.8.1'
上傳下載用到了網路與SD許可權
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
二:MainActivity程式碼
package com.example.view; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.example.R; import com.example.bean.MsgBean; import com.example.presenter.Presenter; import java.io.File; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity implements View.OnClickListener,IView{ private Button uploadfile; private Button downloadfile; private Presenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取id uploadfile = (Button)findViewById(R.id.uploadFile); downloadfile = (Button)findViewById(R.id.downloadFile); //點選監聽 uploadfile.setOnClickListener(this); downloadfile.setOnClickListener(this); //建立presenter層 presenter = new Presenter(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.uploadFile : //要上傳的圖片路徑 File file = new File(Environment.getExternalStorageDirectory().getPath()+"/123.jpg"); if(file.exists()){//判斷是否有此檔案 Map<String, Object> map = new HashMap<>(); map.put("uid", "1653"); map.put("file",file); presenter.uploadFile("http://120.27.23.105/file/upload",map); }else{ Toast.makeText(this,"檔案不存在",Toast.LENGTH_SHORT).show(); } break; case R.id.downloadFile : //http://g.hiphotos.baidu.com/image/pic/item/908fa0ec08fa513d08b6a0ab376d55fbb2fbd9a3.jpg 圖片地址 //設定下載的地址 String sdcardPath = Environment.getExternalStorageDirectory().getPath()+"/123.jpg"; File file2 = new File(sdcardPath); presenter.downloadFile(file2,"http://g.hiphotos.baidu.com/image/pic/item/908fa0ec08fa513d08b6a0ab376d55fbb2fbd9a3.jpg"); break; } } @Override public void onSuccess(Object o,int tag) { if(tag==1){ MsgBean msg = (MsgBean) o; Toast.makeText(this,msg.getMsg(),Toast.LENGTH_SHORT).show(); }else{ //吐司檔案下載路徑 Toast.makeText(this,o+"",Toast.LENGTH_SHORT).show(); } } @Override public void onFailed(Exception e,int tag) { Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); if(presenter!=null){ presenter.detatch(); } } }
三:Presenter
public class Presenter{ private IView iv; public Presenter(IView iv) { this.iv = iv; } public void uploadFile(String url, Map<String, Object> paramsMap) { OkHttpUtils.getInstance().uploadFile(url, paramsMap, new CallBack() { @Override public void onSuccess(Object o) { iv.onSuccess(o,1); } @Override public void onFailed(Exception e) { iv.onFailed(e,1); } }); } public void downloadFile(File file,String url) { OkHttpUtils.getInstance().downloadFile(file , url , new CallBack() { @Override public void onSuccess(Object o) { iv.onSuccess(o,2); } @Override public void onFailed(Exception e) { iv.onFailed(e,2); } }); } //防止記憶體洩漏 public void detatch(){ if (iv != null) { iv = null; } } }
四:介面
public interface CallBack {
void onSuccess(Object o);
void onFailed(Exception e);
}
public interface CallBackPro {
void onSuccess(Object o);
void onFailed(Exception e);
void onProgressBar(Long i);//用來顯示下載進度
}
五:Okhttp封裝上傳下載 presenter呼叫
package com.example.net;
import android.os.Handler;
import com.example.bean.MsgBean;
import com.example.presenter.CallBack;
import com.example.presenter.CallBackPro;
import com.google.gson.Gson;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
/**
* Created by Administrator on 2017/12/25 0025.
*/
public class OkHttpUtils {
public static volatile OkHttpUtils instance;
Handler handler = new Handler();
private OkHttpUtils() {
}
public static OkHttpUtils getInstance() {
if (instance == null) {
synchronized (OkHttpUtils.class) {
if (instance == null) {
instance = new OkHttpUtils();
}
}
}
return instance;
}
public void uploadFile(String url, Map<String,Object> paramsMap, final CallBack callBack) {
MultipartBody.Builder multipartBody = new MultipartBody.Builder();
//form 表單上傳
multipartBody.setType(MultipartBody.FORM);
//拼接引數
for (String key : paramsMap.keySet()) {
Object object = paramsMap.get(key);
if(object instanceof String){
multipartBody.addFormDataPart(key,object.toString());
}else if(object instanceof File){
File file = (File) object;
multipartBody.addFormDataPart(key,file.getName(),MultipartBody.create(MediaType.parse("multipart/form-data"),file));
}
}
RequestBody requestBody=multipartBody.build();
//建立Request物件
Request request=new Request.Builder().url(url).post(requestBody).build();
new OkHttpClient.Builder()
//設定最長讀寫時間
.readTimeout(100000, TimeUnit.SECONDS)
.writeTimeout(100000, TimeUnit.SECONDS)
.connectTimeout(100000, TimeUnit.SECONDS).build()
.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(e.getMessage());
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String str = response.body().string();
//解析
final MsgBean msgBean = new Gson().fromJson(str, MsgBean.class);
handler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(msgBean);
}
});
}
});
}
public void downloadFile(final File file, String url, final CallBackPro callBack) {
// 父目錄是否存在
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdir();
}
// 檔案是否存在
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Request request=new Request.Builder().url(url).get().build();
new OkHttpClient.Builder()
.readTimeout(100000, TimeUnit.SECONDS)
.writeTimeout(100000, TimeUnit.SECONDS)
.connectTimeout(100000, TimeUnit.SECONDS).build()
.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
ResponseBody body = response.body();
// 獲取檔案總長度
final long totalLength = body.contentLength();
//以流的方式進行讀取
InputStream inputStream = body.byteStream();
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[2048];
int len = 0;
int num = 0;
while ((len = inputStream.read(buffer)) != -1){
num+=len;
outputStream.write(buffer,0,len);
final int finalNum = num;
handler.post(new Runnable() {
@Override
public void run() {
callBack.onProgressBar( finalNum *100/totalLength);
}
});
}
//讀取完關閉流
outputStream.flush();
outputStream.close();
inputStream.close();
handler.post(new Runnable() {
@Override
public void run() {
if(file.exists()){
//返回下載檔案路徑
callBack.onSuccess(file.getPath());
}
}
});
}
}
});
}
//get請求
public void get(String url, Map<String,String> map, final CallBack callBack, final Class c){
//對url和引數做拼接處理
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(url);
//判斷是否存在? if中是存在
if(stringBuffer.indexOf("?")!=-1 ){
//判斷?是否在最後一位 if中是不在最後一位
if(stringBuffer.indexOf("?")!=stringBuffer.length()-1){
stringBuffer.append("&");
}
}else{
stringBuffer.append("?");
}
for(Map.Entry<String,String> entry:map.entrySet()){
stringBuffer.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
//判斷是否存在& if中是存在
if(stringBuffer.indexOf("&")!=-1){
stringBuffer.deleteCharAt(stringBuffer.lastIndexOf("&"));
}
//1:建立OkHttpClient物件
OkHttpClient okHttpClient = new OkHttpClient();
//2:建立Request物件
final Request request = new Request.Builder()
.get()
.url(stringBuffer.toString())
.build();
//3:建立Call物件
Call call = okHttpClient.newCall(request);
//4:請求網路
call.enqueue(new Callback() {
//請求失敗
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
}
//請求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
//拿到資料解析
final Object o = new Gson().fromJson(result, c);
//當前是在子執行緒,回到主執行緒中
handler.post(new Runnable() {
@Override
public void run() {
//回撥
callBack.onSuccess(o);
}
});
}
});
}
}