package com.anthony.library.data.upload; import android.app.Notification; import android.util.Log; import com.anthony.library.data.HttpHelper; import com.anthony.library.data.RxBus; import com.anthony.library.data.event.UploadFinishEvent; import com.anthony.library.utils.FileTypeUtil; import com.anthony.library.utils.FileUtil; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.ResponseBody; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * Created by Anthony on 2016/7/8. * Class Note: */ public class UploadTask { public int id; public String mUrl; public Subscription mSubscription; public Notification mNotification; public HashMap<String, File> mFileMap; public HashMap<String, String> mParamMap; public long total = 0; public long progress = 0; public int current_percent = 0; RxBus bus; HttpHelper httpHelper; public UploadTask(int id, String mUrl, HashMap<String, File> map, HashMap<String, String> paramMap) { this.id = id; this.mUrl = mUrl; this.mFileMap = map; this.mParamMap = paramMap; } public void start() { Map<String, RequestBody> files = new HashMap<>(); Iterator fileIterator = mFileMap.entrySet().iterator(); while (fileIterator.hasNext()) { Map.Entry entry = (Map.Entry) fileIterator.next(); String key = (String) entry.getKey(); File file = (File) entry.getValue(); RequestBody fileBody = RequestBody.create(MediaType.parse(getContentType(file)), file); files.put("" + key + "\"; filename=\"" + FileUtil.getUrlFileName(file.getAbsolutePath()) + "", new UploadRequestBody(fileBody, this)); } Iterator paramIterator = mParamMap.entrySet().iterator(); while (paramIterator.hasNext()) { Map.Entry entry = (Map.Entry) paramIterator.next(); String key = (String) entry.getKey(); String val = (String) entry.getValue(); files.put(key, RequestBody.create(MediaType.parse("text/plain"), val)); } mSubscription = httpHelper.getApi(UploadApi.class) .uploadFile(mUrl, files) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<ResponseBody>() { @Override public void call(ResponseBody responseBody) { try { Log.v("FileUpload", responseBody.string()); } catch (IOException e) { e.printStackTrace(); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); bus.post(new UploadFinishEvent(UploadTask.this, false)); } }); } public void cancel() { if (mSubscription != null && !mSubscription.isUnsubscribed()) { mSubscription.unsubscribe(); } } //获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream private String getContentType(File f) { String fileType = FileTypeUtil.getFileType(f.getAbsolutePath()); if (fileType == null || fileType.equals("")) { return "application/octet-stream"; } else { return "image/" + fileType; } } }