Commit f41a44c3f69d4af0998976eadd1271e6de29b375
1 parent
76084802
添加注释
Showing
4 changed files
with
439 additions
and
375 deletions
app/src/main/java/com/cnlive/cnUploadDemo/MultiUploader.java
| @@ -31,6 +31,7 @@ import java.util.Collections; | @@ -31,6 +31,7 @@ import java.util.Collections; | ||
| 31 | import java.util.HashSet; | 31 | import java.util.HashSet; |
| 32 | import java.util.Iterator; | 32 | import java.util.Iterator; |
| 33 | import java.util.List; | 33 | import java.util.List; |
| 34 | +import java.util.Set; | ||
| 34 | import java.util.concurrent.atomic.AtomicInteger; | 35 | import java.util.concurrent.atomic.AtomicInteger; |
| 35 | 36 | ||
| 36 | /** | 37 | /** |
| @@ -40,389 +41,239 @@ import java.util.concurrent.atomic.AtomicInteger; | @@ -40,389 +41,239 @@ import java.util.concurrent.atomic.AtomicInteger; | ||
| 40 | */ | 41 | */ |
| 41 | 42 | ||
| 42 | public class MultiUploader { | 43 | public class MultiUploader { |
| 43 | - private static final String TAG = "MultiUploader"; | 44 | + final private String TAG = "MultiUploader"; |
| 44 | 45 | ||
| 45 | - private String bucketName; | ||
| 46 | private String key; | 46 | private String key; |
| 47 | private File file; | 47 | private File file; |
| 48 | - private int concurrentNo = 2; | ||
| 49 | - private long partSize = 5 * 1024 * 1024; | 48 | + private long partSize = 5 * 1024 * 1024; // 5MB |
| 50 | private String uploadId; | 49 | private String uploadId; |
| 51 | - private AtomicInteger cur; | ||
| 52 | private CNUpload cnUpload; | 50 | private CNUpload cnUpload; |
| 51 | + final static private int INIT_DONE = 0; | ||
| 52 | + final static private int PARTS_DONE = 1; | ||
| 53 | + final static private int COMPLETE_DONE = 2; | ||
| 54 | + final static private int GET_UPLOADED_DONE = 3; | ||
| 53 | 55 | ||
| 54 | - private static final int INIT_DONE = 0; | ||
| 55 | - private static final int PARATS_DONE = 1; | ||
| 56 | - private static final int COMPLETE_DONE = 2; | ||
| 57 | - private static final int GET_UPLOADED_DONE = 3; | ||
| 58 | - private static final int LIMIT_DONE = 4; | 56 | + final List<CNPartETag> doneParts = Collections.synchronizedList(new ArrayList()); |
| 59 | 57 | ||
| 60 | - private boolean pause = false; | ||
| 61 | - private boolean isAbortMultipartUpload = false; | ||
| 62 | - | ||
| 63 | - List<CNPartETag> doneParts = Collections.synchronizedList(new ArrayList<CNPartETag>()); | ||
| 64 | - private List<Integer> leftParts = Collections.synchronizedList(new ArrayList<Integer>()); | ||
| 65 | - private CNCompleteMultipartUploadResponseListener multiListener; | ||
| 66 | - private final MyHandler mHandler = new MyHandler(); | ||
| 67 | - | ||
| 68 | - private void create(CNUpload cnUpload, File file, String uploadId, long partSize) { | 58 | + private void create(CNUpload cnUpload, String key, File file, String uploadId, long partSize) { |
| 69 | this.cnUpload = cnUpload; | 59 | this.cnUpload = cnUpload; |
| 60 | + this.key = key; | ||
| 70 | this.file = file; | 61 | this.file = file; |
| 71 | this.uploadId = uploadId; | 62 | this.uploadId = uploadId; |
| 72 | this.partSize = partSize; | 63 | this.partSize = partSize; |
| 73 | } | 64 | } |
| 74 | 65 | ||
| 75 | - public MultiUploader(CNUpload cnUpload, File file, String uploadId, long partSize) { | ||
| 76 | - this.create(cnUpload, file, uploadId, partSize); | 66 | + public MultiUploader(CNUpload cnUpload, String key, File file, String uploadId, long partSize) { |
| 67 | + create(cnUpload, key, file, uploadId, partSize); | ||
| 77 | } | 68 | } |
| 78 | 69 | ||
| 79 | - public MultiUploader(CNUpload cnUpload, File file, String uploadId) { | ||
| 80 | - this.create(cnUpload, file, uploadId, this.partSize); | 70 | + public MultiUploader(CNUpload cnUpload, String key, File file, String uploadId) { |
| 71 | + create(cnUpload, key, file, uploadId, partSize); | ||
| 81 | } | 72 | } |
| 82 | 73 | ||
| 83 | - public MultiUploader(CNUpload cnUpload, File file) { | ||
| 84 | - this.create(cnUpload, file, null, this.partSize); | 74 | + public MultiUploader(CNUpload cnUpload, String key, File file) { |
| 75 | + create(cnUpload, key, file, null, partSize); | ||
| 85 | } | 76 | } |
| 86 | 77 | ||
| 87 | - public MultiUploader(CNUpload cnUpload, File file, long partSize) { | ||
| 88 | - this.create(cnUpload, file, null, partSize); | 78 | + public MultiUploader(CNUpload cnUpload, String key, File file, long partSize) { |
| 79 | + create(cnUpload, key, file, null, partSize); | ||
| 89 | } | 80 | } |
| 90 | 81 | ||
| 91 | - /** | ||
| 92 | - * 并发传的块数,默认就是2。一般不用改。根据你自测的性能状况来调整。 | ||
| 93 | - * | ||
| 94 | - * @param no | ||
| 95 | - */ | ||
| 96 | - public void setConcurrentNo(int no) { | ||
| 97 | - this.concurrentNo = no; | 82 | + public String getKey() { |
| 83 | + return key; | ||
| 98 | } | 84 | } |
| 99 | 85 | ||
| 100 | - public void setListener(CNCompleteMultipartUploadResponseListener listener) { | ||
| 101 | - this.multiListener = listener; | 86 | + public String getUploadId() { |
| 87 | + return uploadId; | ||
| 102 | } | 88 | } |
| 103 | 89 | ||
| 104 | - public String getKey() { | ||
| 105 | - return this.key; | 90 | + abstract class MyUploadPartResponceHandler implements CNUploadPartResponseListener { |
| 91 | + private String key; | ||
| 92 | + private int partNo; | ||
| 93 | + private String uploadId; | ||
| 94 | + | ||
| 95 | + public abstract void onSuccess(int statesCode, Header[] responceHeaders, CNPartETag result, String key, int partNo, String uploadId); | ||
| 96 | + | ||
| 97 | + public abstract void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable throwable | ||
| 98 | + , String key, int partNo, String uploadId); | ||
| 99 | + | ||
| 100 | + public abstract void onTaskProgress(double progress, String key, int partNo, String uploadId); | ||
| 101 | + | ||
| 102 | + public MyUploadPartResponceHandler(String key, int partNo, String uploadId) { | ||
| 103 | + this.key = key; | ||
| 104 | + this.partNo = partNo; | ||
| 105 | + this.uploadId = uploadId; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + @Override | ||
| 109 | + public void onTaskProgress(double progress) { | ||
| 110 | + onTaskProgress(progress, key, partNo, uploadId); | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + @Override | ||
| 114 | + public void onSuccess(int statesCode, Header[] responceHeaders, CNPartETag result) { | ||
| 115 | + onSuccess(statesCode, responceHeaders, result, key, partNo, uploadId); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + @Override | ||
| 119 | + public void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable throwable) { | ||
| 120 | + onFailure(statesCode, error, responceHeaders, response, throwable, key, partNo, uploadId); | ||
| 121 | + } | ||
| 106 | } | 122 | } |
| 107 | 123 | ||
| 108 | - public String getUploadId() { | ||
| 109 | - return this.uploadId; | 124 | + private final MyHandler mHandler = new MyHandler(); |
| 125 | + | ||
| 126 | + class MyHandler extends Handler { | ||
| 127 | + @Override | ||
| 128 | + public void handleMessage(Message msg) { | ||
| 129 | + switch (msg.what) { | ||
| 130 | + case INIT_DONE: | ||
| 131 | + uploadParts(); | ||
| 132 | + break; | ||
| 133 | + case PARTS_DONE: | ||
| 134 | + completeUpload(); | ||
| 135 | + break; | ||
| 136 | + case GET_UPLOADED_DONE: | ||
| 137 | + List<CNPartETag> res = (List<CNPartETag>) msg.obj; | ||
| 138 | + reUpload(res); | ||
| 139 | + break; | ||
| 140 | + default: | ||
| 141 | + break; | ||
| 142 | + } | ||
| 143 | + } | ||
| 110 | } | 144 | } |
| 111 | 145 | ||
| 112 | - /** | ||
| 113 | - * 初始化分块上传 | ||
| 114 | - * | ||
| 115 | - * @param name 文件名 | ||
| 116 | - * @param des 描述 | ||
| 117 | - * @param userId 用户id | ||
| 118 | - * @param filePath 文件路径 | ||
| 119 | - * @param file 图片 | ||
| 120 | - * @param isHorizontalScreen 横竖屏 | ||
| 121 | - * @param callback 回到地址 | ||
| 122 | - * @return | 146 | + /* |
| 147 | + return false, if uploadId hasbeen got | ||
| 123 | */ | 148 | */ |
| 124 | - public boolean upload(String name, String des, String userId, String filePath, File file, int isHorizontalScreen, String callback) { | ||
| 125 | -// pause = false; | ||
| 126 | - if (this.uploadId != null) { | ||
| 127 | - return false; | ||
| 128 | - } else { | ||
| 129 | - isAbortMultipartUpload = false; | ||
| 130 | - final CNInitiateMultipartUploadRequest request = new CNInitiateMultipartUploadRequest( key); | ||
| 131 | - request.setCannedACL(CNCannedAccessControlList.PublicRead); | ||
| 132 | - request.setContentType("video/mp4"); | ||
| 133 | - cnUpload.initiateMultipartUpload(request, new CNInitiateMultipartUploadResponseListener() { | ||
| 134 | - @Override | ||
| 135 | - public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | ||
| 136 | - Log.w(TAG, "init multiupload fail, statusCode = " + i, throwable); | ||
| 137 | - } | 149 | + public boolean upload() { |
| 150 | + if (uploadId != null) return false; | ||
| 151 | + CNInitiateMultipartUploadRequest request = new CNInitiateMultipartUploadRequest(key); | ||
| 152 | + cnUpload.initiateMultipartUpload(request, new CNInitiateMultipartUploadResponseListener() { | ||
| 153 | + @Override | ||
| 154 | + public void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable paramThrowable) { | ||
| 155 | + Log.w(TAG, "init multiupload fail, statesCode=" + statesCode, paramThrowable); | ||
| 156 | + } | ||
| 138 | 157 | ||
| 139 | - @Override | ||
| 140 | - public void onSuccess(int i, Header[] headers, CNInitiateMultipartUploadResult cnInitiateMultipartUploadResult) { | ||
| 141 | - uploadId = cnInitiateMultipartUploadResult.getUploadId(); | ||
| 142 | - Log.d(TAG, "init multiupload success, uploadId = " + uploadId + ", key = " + key + " : " + cnInitiateMultipartUploadResult.getBucket() + " : " + cnInitiateMultipartUploadResult.getKey()); | ||
| 143 | - bucketName = cnInitiateMultipartUploadResult.getBucket(); | ||
| 144 | - key = cnInitiateMultipartUploadResult.getKey(); | ||
| 145 | - mHandler.sendEmptyMessage(INIT_DONE); | ||
| 146 | - } | ||
| 147 | - }); | ||
| 148 | - return true; | ||
| 149 | - } | 158 | + @Override |
| 159 | + public void onSuccess(int statesCode, Header[] responceHeaders, CNInitiateMultipartUploadResult result) { | ||
| 160 | + uploadId = result.getUploadId(); | ||
| 161 | + Log.d(TAG, "init multiupload success, uploadId=" + uploadId + ",key=" + key); | ||
| 162 | + mHandler.sendEmptyMessage(INIT_DONE); | ||
| 163 | + } | ||
| 164 | + }); | ||
| 165 | + return true; | ||
| 150 | } | 166 | } |
| 151 | 167 | ||
| 152 | private List<CNPartETag> convertPart(List<CNPart> list) { | 168 | private List<CNPartETag> convertPart(List<CNPart> list) { |
| 153 | - ArrayList res = new ArrayList(); | ||
| 154 | - Iterator iterator = list.iterator(); | ||
| 155 | - | ||
| 156 | - while (iterator.hasNext()) { | ||
| 157 | - CNPart part = (CNPart) iterator.next(); | ||
| 158 | - res.add(new CNPartETag(part.getPartNumber(), part.getETag())); | 169 | + List<CNPartETag> res = new ArrayList<CNPartETag>(); |
| 170 | + for (CNPart p : list) { | ||
| 171 | + res.add(new CNPartETag(p.getPartNumber(), p.getETag())); | ||
| 159 | } | 172 | } |
| 160 | return res; | 173 | return res; |
| 161 | } | 174 | } |
| 162 | 175 | ||
| 163 | - /** | ||
| 164 | - * 罗列出已经上传的块 | 176 | + /* |
| 177 | + Get from ks3 server. call list parts API. | ||
| 165 | */ | 178 | */ |
| 166 | public void getUploadedParts() { | 179 | public void getUploadedParts() { |
| 167 | - final ArrayList res = new ArrayList(); | ||
| 168 | - CNListPartsResponseListener listener = new CNListPartsResponseListener() { | 180 | + final List<CNPartETag> res = new ArrayList<CNPartETag>(); |
| 181 | + final CNListPartsResponseListener listPartsResponseHandler = new CNListPartsResponseListener() { | ||
| 169 | @Override | 182 | @Override |
| 170 | - public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | ||
| 171 | - Log.w(TAG, "list parts, statusCode = " + i, throwable); | 183 | + public void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable paramThrowable) { |
| 184 | + Log.w(TAG, "list parts, statesCode=" + statesCode, paramThrowable); | ||
| 172 | } | 185 | } |
| 173 | 186 | ||
| 174 | @Override | 187 | @Override |
| 175 | - public void onSuccess(int i, Header[] headers, CNListPartsResult cnListPartsResult) { | ||
| 176 | - res.addAll(convertPart(cnListPartsResult.getCNParts())); | ||
| 177 | - Log.e(TAG, "getUploadedParts = " + res.size()); | ||
| 178 | - if (pause) { | ||
| 179 | - doneParts = res; | ||
| 180 | - pause = false; | ||
| 181 | - } | ||
| 182 | - if (!cnListPartsResult.isTruncated()) { | 188 | + public void onSuccess(int statesCode, Header[] responceHeaders, CNListPartsResult listPartsResult) { |
| 189 | + res.addAll(convertPart(listPartsResult.getCNParts())); | ||
| 190 | + if (!listPartsResult.isTruncated()) | ||
| 183 | mHandler.sendMessage(Message.obtain(mHandler, GET_UPLOADED_DONE, res)); | 191 | mHandler.sendMessage(Message.obtain(mHandler, GET_UPLOADED_DONE, res)); |
| 184 | - } else { | ||
| 185 | - Log.e(TAG, "File size too large. You may not use phone to upload"); | ||
| 186 | - } | 192 | + else |
| 193 | + Log.e(TAG, "File size too largs. You may not use phone to upload"); | ||
| 187 | } | 194 | } |
| 188 | }; | 195 | }; |
| 189 | - cnUpload.listParts(key, uploadId, listener); | 196 | + cnUpload.listParts(key, uploadId, listPartsResponseHandler); |
| 190 | } | 197 | } |
| 191 | 198 | ||
| 192 | - /** | ||
| 193 | - * 获取到还没有上传的块 | ||
| 194 | - * | ||
| 195 | - * @param uploadedParts 已经上传的块 | ||
| 196 | - * @return | ||
| 197 | - */ | ||
| 198 | public List<Integer> getLeftParts(List<CNPartETag> uploadedParts) { | 199 | public List<Integer> getLeftParts(List<CNPartETag> uploadedParts) { |
| 199 | - ArrayList res = new ArrayList(); | 200 | + List<Integer> res = new ArrayList<Integer>(); |
| 200 | long start = 0L; | 201 | long start = 0L; |
| 201 | int partNumber = 1; | 202 | int partNumber = 1; |
| 202 | - HashSet set = new HashSet(); | ||
| 203 | - Iterator iterator = uploadedParts.iterator(); | ||
| 204 | - | ||
| 205 | - while (iterator.hasNext()) { | ||
| 206 | - CNPartETag cnPartETag = (CNPartETag) iterator.next(); | ||
| 207 | - set.add(Integer.valueOf(cnPartETag.getPartNumber())); | 203 | + Set<Integer> set = new HashSet<Integer>(); |
| 204 | + for (CNPartETag p : uploadedParts) { | ||
| 205 | + set.add(p.getPartNumber()); | ||
| 208 | } | 206 | } |
| 209 | - | ||
| 210 | while (start < file.length()) { | 207 | while (start < file.length()) { |
| 211 | - if (!set.contains(Integer.valueOf(partNumber))) { | ||
| 212 | - res.add(Integer.valueOf(partNumber)); | ||
| 213 | - } | ||
| 214 | - ++partNumber; | 208 | + if (!set.contains(partNumber)) |
| 209 | + res.add(partNumber); | ||
| 210 | + partNumber++; | ||
| 215 | start += partSize; | 211 | start += partSize; |
| 216 | } | 212 | } |
| 217 | return res; | 213 | return res; |
| 218 | } | 214 | } |
| 219 | 215 | ||
| 220 | - /** | ||
| 221 | - * 继续上传 | ||
| 222 | - */ | ||
| 223 | public void reUpload() { | 216 | public void reUpload() { |
| 224 | - if (this.uploadId == null) { | 217 | + if (uploadId == null) { |
| 225 | Log.i(TAG, "no upload id, cannot reupload"); | 218 | Log.i(TAG, "no upload id, cannot reupload"); |
| 226 | - } else { | ||
| 227 | - getUploadedParts(); | 219 | + return; |
| 228 | } | 220 | } |
| 221 | + getUploadedParts(); | ||
| 229 | } | 222 | } |
| 230 | 223 | ||
| 231 | - private CNPartETag cnPartETag = new CNPartETag(); | ||
| 232 | - | ||
| 233 | - /** | ||
| 234 | - * 开始分块上传 | ||
| 235 | - * | ||
| 236 | - * @param startNo | ||
| 237 | - * @param N | ||
| 238 | - */ | ||
| 239 | - public void doWithLimit(int startNo, final int N) { | ||
| 240 | - | ||
| 241 | - for (int i = startNo; i < startNo + concurrentNo && i < leftParts.size(); ++i) { | ||
| 242 | -// Log.e(TAG, isPause() + " "); | ||
| 243 | - | ||
| 244 | -// if (isPause()) { | ||
| 245 | -// break; | ||
| 246 | -// } else { | ||
| 247 | - final int partNumber = ((Integer) this.leftParts.get(i)).intValue(); | ||
| 248 | - long offset = partNumber * this.partSize - partSize; | ||
| 249 | - CNUploadPartRequest request = new CNUploadPartRequest(key, uploadId, file, offset, partNumber, Math.min(file.length() - offset, partSize)); | ||
| 250 | - request.setCannedACL(CNCannedAccessControlList.PublicReadWrite); | ||
| 251 | - request.setContentType("video/mp4"); | ||
| 252 | - cnUpload.uploadPart(request, new MyUploadPartResponseHandler(key, partNumber, uploadId) { | 224 | + public void reUpload(final List<CNPartETag> uploadedParts) { |
| 225 | + final List<Integer> leftParts = getLeftParts(uploadedParts); | ||
| 226 | + final int N = leftParts.size() + uploadedParts.size(); | ||
| 227 | + doneParts.addAll(uploadedParts); | ||
| 228 | + if (leftParts.isEmpty()) | ||
| 229 | + mHandler.sendEmptyMessage(PARTS_DONE); | ||
| 230 | + for (Integer partNumber : leftParts) { | ||
| 231 | + long offset = partNumber * partSize - partSize; | ||
| 232 | + CNUploadPartRequest uploadPartRequest = new CNUploadPartRequest(key, uploadId, file, | ||
| 233 | + offset, partNumber, Math.min(file.length() - offset, partSize)); | ||
| 234 | + cnUpload.uploadPart(uploadPartRequest, new MyUploadPartResponceHandler(key, partNumber, uploadId) { | ||
| 253 | @Override | 235 | @Override |
| 254 | - public void onSuccess(int statusCode, Header[] responseHeaders, CNPartETag result, String key, int partNo, String uploadId) { | ||
| 255 | - cnPartETag = result; | 236 | + public void onSuccess(int statesCode, Header[] responceHeaders, CNPartETag result, String key, int partNo, String uploadId) { |
| 256 | result.setPartNumber(partNo); | 237 | result.setPartNumber(partNo); |
| 257 | - if (!isAbortMultipartUpload) | ||
| 258 | - doneParts.add(result); | ||
| 259 | - cur.incrementAndGet(); | ||
| 260 | - Log.e(TAG, "doneParts = " + doneParts.size() + " ,N = " + N); | ||
| 261 | - if (doneParts.size() >= N) { | ||
| 262 | - mHandler.sendEmptyMessage(PARATS_DONE); | ||
| 263 | - } else if (cur.get() % concurrentNo == 0) { | ||
| 264 | - mHandler.sendMessage(Message.obtain(mHandler, LIMIT_DONE, cur.get(), N)); | ||
| 265 | - } | 238 | + doneParts.add(result); |
| 239 | + if (doneParts.size() == N) | ||
| 240 | + mHandler.sendEmptyMessage(PARTS_DONE); | ||
| 266 | } | 241 | } |
| 267 | 242 | ||
| 268 | @Override | 243 | @Override |
| 269 | - public void onFailure(int statusCode, UploadError error, Header[] responseHeaders, String response, Throwable throwable, String key, int partNo, String uploadId) { | ||
| 270 | - Log.w(TAG, "upload part fail, uploadId = " + uploadId + " ,key = " + key + " ,partNo = " + partNo, throwable); | ||
| 271 | - if (multiListener != null) { | ||
| 272 | - multiListener.onFailure(statusCode, error, responseHeaders, response, throwable); | ||
| 273 | - } | 244 | + public void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable throwable, |
| 245 | + String key, int partNo, String uploadId) { | ||
| 246 | + // you may record this failure info in file, database, or backend | ||
| 247 | + Log.w(TAG, "upload part fail, uploadId=" + uploadId + ",key=" + key + ",partNo=" + partNo, throwable); | ||
| 274 | } | 248 | } |
| 275 | 249 | ||
| 276 | @Override | 250 | @Override |
| 277 | - public void onTaskProcess(double progress, String key, int partNo, String uploadId) { | ||
| 278 | - if (progress > 99) { | ||
| 279 | - Log.d(TAG, "progress : " + progress + " ,key = " + key + " ,partNo = " + partNo); | ||
| 280 | - } | 251 | + public void onTaskProgress(double progress, String key, int partNo, String uploadId) { |
| 252 | + if (progress >= 99) | ||
| 253 | + Log.i(TAG, "progress:" + progress + ",key=" + key + ",partNo" + partNo); | ||
| 281 | } | 254 | } |
| 282 | }); | 255 | }); |
| 283 | -// } | ||
| 284 | } | 256 | } |
| 285 | } | 257 | } |
| 286 | 258 | ||
| 287 | - /** | ||
| 288 | - * 取消分块上传 | ||
| 289 | - */ | ||
| 290 | - public void cancelUpload() { | ||
| 291 | - CNAbortMultipartUploadRequest request = new CNAbortMultipartUploadRequest(key, uploadId); | ||
| 292 | - cnUpload.abortMultipartUpload(request, new CNAbortMultipartUploadResponseListener() { | ||
| 293 | - @Override | ||
| 294 | - public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | ||
| 295 | - Log.e(TAG, "abortMultipart fail , stateCode = " + i, throwable); | ||
| 296 | - } | ||
| 297 | - | ||
| 298 | - @Override | ||
| 299 | - public void onSuccess(int i, Header[] headers) { | ||
| 300 | - Log.e(TAG, "abortMultipart success"); | ||
| 301 | - isAbortMultipartUpload = true; | ||
| 302 | - if (uploadId != null) { | ||
| 303 | - uploadId = null; | ||
| 304 | - } | ||
| 305 | - if (doneParts != null) doneParts.clear(); | ||
| 306 | - } | ||
| 307 | - }); | ||
| 308 | - } | ||
| 309 | - | ||
| 310 | - public void reUpload(List<CNPartETag> uploadedParts) { | ||
| 311 | - leftParts = getLeftParts(uploadedParts); | ||
| 312 | - Log.e(TAG, "reupload uploadedParts = " + uploadedParts.size() + " , leftParts = " + leftParts.size()); | ||
| 313 | - | ||
| 314 | - int N = leftParts.size() + uploadedParts.size(); | ||
| 315 | - cur = new AtomicInteger(0); | ||
| 316 | - | ||
| 317 | -// doneParts.addAll(uploadedParts); | ||
| 318 | - | ||
| 319 | - if (leftParts.isEmpty()) { | ||
| 320 | - mHandler.sendEmptyMessage(PARATS_DONE); | ||
| 321 | - } | ||
| 322 | - Log.e(TAG, "reupload uploadedsize = " + doneParts.size() + " ,N = " + N); | ||
| 323 | - doWithLimit(0, N); | ||
| 324 | - } | ||
| 325 | - | ||
| 326 | private void uploadParts() { | 259 | private void uploadParts() { |
| 327 | reUpload(new ArrayList<CNPartETag>()); | 260 | reUpload(new ArrayList<CNPartETag>()); |
| 328 | } | 261 | } |
| 329 | 262 | ||
| 330 | - /** | ||
| 331 | - * 组装上传的块 | ||
| 332 | - */ | ||
| 333 | private void completeUpload() { | 263 | private void completeUpload() { |
| 334 | - if (multiListener == null) { | ||
| 335 | - multiListener = new CNCompleteMultipartUploadResponseListener() { | ||
| 336 | - @Override | ||
| 337 | - public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | ||
| 338 | - Log.w(TAG, "complete upload fail, statusCode = " + i, throwable); | ||
| 339 | - } | ||
| 340 | - | ||
| 341 | - @Override | ||
| 342 | - public void onSuccess(int i, Header[] headers, CNCompleteMultipartUploadResult completeMultipartUploadResult) { | ||
| 343 | - Log.i(TAG, "complete upload, key = " + key + ", bucketName = " + bucketName + " , uploadId = " + uploadId + "\n" + completeMultipartUploadResult.toString()); | ||
| 344 | - | ||
| 345 | - } | ||
| 346 | - }; | ||
| 347 | - } | ||
| 348 | - CNCompleteMultipartUploadRequest request = new CNCompleteMultipartUploadRequest(bucketName, key); | ||
| 349 | - request.setContentType("video/mp4"); | ||
| 350 | - request.setCNPartETags(doneParts); | ||
| 351 | - request.setUploadId(uploadId); | ||
| 352 | - cnUpload.completeMultipartUpload(request, multiListener); | ||
| 353 | - } | ||
| 354 | - | ||
| 355 | - class MyHandler extends Handler { | ||
| 356 | - MyHandler() { | ||
| 357 | - | ||
| 358 | - } | ||
| 359 | - | ||
| 360 | - @Override | ||
| 361 | - public void handleMessage(Message msg) { | ||
| 362 | - switch (msg.what) { | ||
| 363 | - case INIT_DONE: | ||
| 364 | - uploadParts(); | ||
| 365 | - break; | ||
| 366 | - case PARATS_DONE: | ||
| 367 | - completeUpload(); | ||
| 368 | - break; | ||
| 369 | - case COMPLETE_DONE: | ||
| 370 | - default: | ||
| 371 | - break; | ||
| 372 | - case GET_UPLOADED_DONE: | ||
| 373 | - List res = (List) msg.obj; | ||
| 374 | - reUpload(res); | ||
| 375 | - break; | ||
| 376 | - case LIMIT_DONE: | ||
| 377 | - int no = msg.arg1; | ||
| 378 | - int N = msg.arg2; | ||
| 379 | - doWithLimit(no, N); | ||
| 380 | - break; | 264 | + cnUpload.completeMultipartUpload(key, uploadId, doneParts, new CNCompleteMultipartUploadResponseListener() { |
| 265 | + @Override | ||
| 266 | + public void onFailure(int statesCode, UploadError error, Header[] responceHeaders, String response, Throwable paramThrowable) { | ||
| 267 | + Log.w(TAG, "complete upload fail, statusCode=" + statesCode, paramThrowable); | ||
| 381 | } | 268 | } |
| 382 | - } | ||
| 383 | - } | ||
| 384 | - | ||
| 385 | - abstract class MyUploadPartResponseHandler implements CNUploadPartResponseListener { | ||
| 386 | - private String key; | ||
| 387 | - private int partNo; | ||
| 388 | - private String uploadId; | ||
| 389 | - | ||
| 390 | - public abstract void onSuccess(int statusCode, Header[] responseHeaders, CNPartETag result, String key, int partNo, String uploadId); | ||
| 391 | - | ||
| 392 | - public abstract void onFailure(int statusCode, UploadError error, Header[] responseHeaders, String response, Throwable throwable, String key, int partNo, String uploadId); | ||
| 393 | - | ||
| 394 | - public abstract void onTaskProcess(double progress, String key, int partNo, String uploadId); | ||
| 395 | 269 | ||
| 396 | - public MyUploadPartResponseHandler(String key, int partNo, String uploadId) { | ||
| 397 | - this.key = key; | ||
| 398 | - this.partNo = partNo; | ||
| 399 | - this.uploadId = uploadId; | ||
| 400 | - } | ||
| 401 | - | ||
| 402 | - @Override | ||
| 403 | - public void onTaskProgress(double v) { | ||
| 404 | - this.onTaskProcess(v, this.key, this.partNo, this.uploadId); | ||
| 405 | - } | ||
| 406 | - | ||
| 407 | - @Override | ||
| 408 | - public void onSuccess(int i, Header[] headers, CNPartETag cnPartETag) { | ||
| 409 | - this.onSuccess(i, headers, cnPartETag, this.key, this.partNo, this.uploadId); | ||
| 410 | - } | ||
| 411 | - | ||
| 412 | - @Override | ||
| 413 | - public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | ||
| 414 | - this.onFailure(i, uploadError, headers, s, throwable, this.key, this.partNo, this.uploadId); | ||
| 415 | - } | 270 | + @Override |
| 271 | + public void onSuccess(int statesCode, Header[] responceHeaders, CNCompleteMultipartUploadResult result) { | ||
| 272 | + Log.i(TAG, "complete upload, key=" + key); | ||
| 273 | + } | ||
| 274 | + }); | ||
| 416 | } | 275 | } |
| 417 | 276 | ||
| 418 | -// public boolean isPause() { | ||
| 419 | -// return pause; | ||
| 420 | -// } | ||
| 421 | - | ||
| 422 | -// public void setPause(boolean pause) { | ||
| 423 | -// this.pause = pause; | ||
| 424 | -// } | ||
| 425 | - | ||
| 426 | /** | 277 | /** |
| 427 | * 此暂停方法,会立即暂停,继续上传时,当前块重新上传 | 278 | * 此暂停方法,会立即暂停,继续上传时,当前块重新上传 |
| 428 | * 也可以通过不上传下一块的方法暂停上传 | 279 | * 也可以通过不上传下一块的方法暂停上传 |
| @@ -431,6 +282,5 @@ public class MultiUploader { | @@ -431,6 +282,5 @@ public class MultiUploader { | ||
| 431 | */ | 282 | */ |
| 432 | public void pause(Context context) { | 283 | public void pause(Context context) { |
| 433 | cnUpload.pause(context); | 284 | cnUpload.pause(context); |
| 434 | - pause = true; | ||
| 435 | } | 285 | } |
| 436 | } | 286 | } |
app/src/main/java/com/cnlive/cnUploadDemo/activity/UploadActivity.java
| @@ -97,6 +97,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -97,6 +97,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 97 | switchDir(Environment.getExternalStorageDirectory()); | 97 | switchDir(Environment.getExternalStorageDirectory()); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | + /** | ||
| 101 | + * 选择文件 | ||
| 102 | + * | ||
| 103 | + * @param dir 文件 | ||
| 104 | + */ | ||
| 100 | private void switchDir(File dir) { | 105 | private void switchDir(File dir) { |
| 101 | if (dir == null || !dir.exists() || dir.isFile()) | 106 | if (dir == null || !dir.exists() || dir.isFile()) |
| 102 | throw new IllegalArgumentException("illegal dir"); | 107 | throw new IllegalArgumentException("illegal dir"); |
| @@ -152,8 +157,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -152,8 +157,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 152 | return super.onKeyDown(keyCode, event); | 157 | return super.onKeyDown(keyCode, event); |
| 153 | } | 158 | } |
| 154 | 159 | ||
| 160 | + | ||
| 155 | /** | 161 | /** |
| 156 | * 上传操作,如果大于16MB,则使用分块上传 | 162 | * 上传操作,如果大于16MB,则使用分块上传 |
| 163 | + * | ||
| 164 | + * @param item 自定义文件对象 | ||
| 157 | */ | 165 | */ |
| 158 | private void doUpload(final UploadFile item) { | 166 | private void doUpload(final UploadFile item) { |
| 159 | if (item.file == null) { | 167 | if (item.file == null) { |
| @@ -178,7 +186,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -178,7 +186,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 178 | /** | 186 | /** |
| 179 | * 单块上传 | 187 | * 单块上传 |
| 180 | * | 188 | * |
| 181 | - * @param item | 189 | + * @param item 自定义文件对象 |
| 182 | */ | 190 | */ |
| 183 | private void doSingleUpload(final UploadFile item) { | 191 | private void doSingleUpload(final UploadFile item) { |
| 184 | 192 | ||
| @@ -189,9 +197,16 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -189,9 +197,16 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 189 | //设置上传的文件的内容类型 | 197 | //设置上传的文件的内容类型 |
| 190 | request.setContentType("video/mp4"); | 198 | request.setContentType("video/mp4"); |
| 191 | cnUpload.putObject(request, new CNPutObjectResponseListener() { | 199 | cnUpload.putObject(request, new CNPutObjectResponseListener() { |
| 200 | + /** | ||
| 201 | + * 上传失败 | ||
| 202 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 203 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 204 | + * @param headers Http请求响应报头 | ||
| 205 | + * @param s 失败时返回的响应正文 | ||
| 206 | + * @param throwable 出错时抛出的异常 | ||
| 207 | + */ | ||
| 192 | @Override | 208 | @Override |
| 193 | public void onTaskFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 209 | public void onTaskFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 194 | - //失败 | ||
| 195 | Log.d(TAG, uploadError.getErrorMessage() + " : " + s + " : " + i); | 210 | Log.d(TAG, uploadError.getErrorMessage() + " : " + s + " : " + i); |
| 196 | List<UploadFile> uploadFiles = dataSource.get(currentDir | 211 | List<UploadFile> uploadFiles = dataSource.get(currentDir |
| 197 | .getPath()); | 212 | .getPath()); |
| @@ -205,16 +220,22 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -205,16 +220,22 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 205 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 220 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 206 | } | 221 | } |
| 207 | 222 | ||
| 223 | + /** | ||
| 224 | + * 上传成功 | ||
| 225 | + * @param i Http请求返回的状态码 | ||
| 226 | + * @param headers Http请求响应报头 | ||
| 227 | + */ | ||
| 208 | @Override | 228 | @Override |
| 209 | public void onTaskSuccess(int i, Header[] headers) { | 229 | public void onTaskSuccess(int i, Header[] headers) { |
| 210 | - //上传成功 | ||
| 211 | Log.i(TAG, "single upload success"); | 230 | Log.i(TAG, "single upload success"); |
| 212 | getUploadedUrl(); | 231 | getUploadedUrl(); |
| 213 | } | 232 | } |
| 214 | 233 | ||
| 234 | + /** | ||
| 235 | + * 上传开始 | ||
| 236 | + */ | ||
| 215 | @Override | 237 | @Override |
| 216 | public void onTaskStart() { | 238 | public void onTaskStart() { |
| 217 | - //上传开始 | ||
| 218 | List<UploadFile> uploadFiles = dataSource.get(currentDir | 239 | List<UploadFile> uploadFiles = dataSource.get(currentDir |
| 219 | .getPath()); | 240 | .getPath()); |
| 220 | for (UploadFile file : uploadFiles) { | 241 | for (UploadFile file : uploadFiles) { |
| @@ -229,9 +250,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -229,9 +250,11 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 229 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 250 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 230 | } | 251 | } |
| 231 | 252 | ||
| 253 | + /** | ||
| 254 | + * 上传结束 包括上传成功结束与上传失败结束 | ||
| 255 | + */ | ||
| 232 | @Override | 256 | @Override |
| 233 | public void onTaskFinish() { | 257 | public void onTaskFinish() { |
| 234 | - //上传结束 包括上传成功结束与上传失败结束 | ||
| 235 | List<UploadFile> uploadFiles = dataSource.get(currentDir | 258 | List<UploadFile> uploadFiles = dataSource.get(currentDir |
| 236 | .getPath()); | 259 | .getPath()); |
| 237 | for (UploadFile file : uploadFiles) { | 260 | for (UploadFile file : uploadFiles) { |
| @@ -246,15 +269,20 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -246,15 +269,20 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 246 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 269 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 247 | } | 270 | } |
| 248 | 271 | ||
| 272 | + /** | ||
| 273 | + * 上传取消 | ||
| 274 | + */ | ||
| 249 | @Override | 275 | @Override |
| 250 | public void onTaskCancel() { | 276 | public void onTaskCancel() { |
| 251 | - //上传取消 | ||
| 252 | Log.d(TAG, "single upload cancel"); | 277 | Log.d(TAG, "single upload cancel"); |
| 253 | } | 278 | } |
| 254 | 279 | ||
| 280 | + /** | ||
| 281 | + * 上传进度 | ||
| 282 | + * @param v 返回上传进度 | ||
| 283 | + */ | ||
| 255 | @Override | 284 | @Override |
| 256 | public void onTaskProgress(double v) { | 285 | public void onTaskProgress(double v) { |
| 257 | - //上传进度 | ||
| 258 | List<UploadFile> uploadFiles = dataSource.get(currentDir.getPath()); | 286 | List<UploadFile> uploadFiles = dataSource.get(currentDir.getPath()); |
| 259 | for (UploadFile file : uploadFiles) { | 287 | for (UploadFile file : uploadFiles) { |
| 260 | if (file.file.getPath().equalsIgnoreCase(item.file.getPath())) { | 288 | if (file.file.getPath().equalsIgnoreCase(item.file.getPath())) { |
| @@ -272,7 +300,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -272,7 +300,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 272 | /** | 300 | /** |
| 273 | * 初始化分块上传 | 301 | * 初始化分块上传 |
| 274 | * | 302 | * |
| 275 | - * @param item | 303 | + * @param item 自定义文件对象 |
| 276 | */ | 304 | */ |
| 277 | private void doMultipartUpload(final UploadFile item) { | 305 | private void doMultipartUpload(final UploadFile item) { |
| 278 | 306 | ||
| @@ -283,6 +311,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -283,6 +311,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 283 | //设置bucket权限 | 311 | //设置bucket权限 |
| 284 | request.setCannedACL(CNCannedAccessControlList.PublicRead); | 312 | request.setCannedACL(CNCannedAccessControlList.PublicRead); |
| 285 | cnUpload.initiateMultipartUpload(request, new CNInitiateMultipartUploadResponseListener() { | 313 | cnUpload.initiateMultipartUpload(request, new CNInitiateMultipartUploadResponseListener() { |
| 314 | + /** | ||
| 315 | + * | ||
| 316 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 317 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 318 | + * @param headers Http请求响应报头 | ||
| 319 | + * @param s 失败时返回的响应正文 | ||
| 320 | + * @param throwable 出错时抛出的异常 | ||
| 321 | + */ | ||
| 286 | @Override | 322 | @Override |
| 287 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 323 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 288 | //初始化多块上传失败 | 324 | //初始化多块上传失败 |
| @@ -298,6 +334,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -298,6 +334,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 298 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 334 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 299 | } | 335 | } |
| 300 | 336 | ||
| 337 | + /** | ||
| 338 | + * 初始化多块上传成功 | ||
| 339 | + * @param i Http请求返回的状态码 | ||
| 340 | + * @param headers Http请求响应报头 | ||
| 341 | + * @param cnInitiateMultipartUploadResult 初始化分块上传结果实体类,包含bucketName、objectKey、uploadId(分块上传的文件的标识)信息等 | ||
| 342 | + */ | ||
| 301 | @Override | 343 | @Override |
| 302 | public void onSuccess(int i, Header[] headers, CNInitiateMultipartUploadResult cnInitiateMultipartUploadResult) { | 344 | public void onSuccess(int i, Header[] headers, CNInitiateMultipartUploadResult cnInitiateMultipartUploadResult) { |
| 303 | //初始化多块上传成功 | 345 | //初始化多块上传成功 |
| @@ -319,6 +361,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -319,6 +361,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 319 | 361 | ||
| 320 | UploadPartRequestFactory localUploadPartRequestFactory; | 362 | UploadPartRequestFactory localUploadPartRequestFactory; |
| 321 | 363 | ||
| 364 | + /** | ||
| 365 | + * 上传分块 | ||
| 366 | + * | ||
| 367 | + * @param initResult 初始化分块上传后获得的result,包含bucketName、objectKey、uploadId | ||
| 368 | + * @param item 自定义文件对象 | ||
| 369 | + */ | ||
| 322 | private void beginMultiUpload(CNInitiateMultipartUploadResult initResult, | 370 | private void beginMultiUpload(CNInitiateMultipartUploadResult initResult, |
| 323 | UploadFile item) { | 371 | UploadFile item) { |
| 324 | localUploadPartRequestFactory = new UploadPartRequestFactory( | 372 | localUploadPartRequestFactory = new UploadPartRequestFactory( |
| @@ -336,8 +384,8 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -336,8 +384,8 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 336 | /** | 384 | /** |
| 337 | * 上传分块 | 385 | * 上传分块 |
| 338 | * | 386 | * |
| 339 | - * @param requestFactory | ||
| 340 | - * @param item | 387 | + * @param requestFactory UploadPartRequest工厂,用于分块上传操作 |
| 388 | + * @param item 自定义文件对象 | ||
| 341 | */ | 389 | */ |
| 342 | private void uploadpart(final UploadPartRequestFactory requestFactory, final UploadFile item) { | 390 | private void uploadpart(final UploadPartRequestFactory requestFactory, final UploadFile item) { |
| 343 | if (requestFactory.hasMoreRequests()) { | 391 | if (requestFactory.hasMoreRequests()) { |
| @@ -345,6 +393,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -345,6 +393,12 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 345 | cnUpload.uploadPart(request, new CNUploadPartResponseListener() { | 393 | cnUpload.uploadPart(request, new CNUploadPartResponseListener() { |
| 346 | double progressInFile = 0; | 394 | double progressInFile = 0; |
| 347 | 395 | ||
| 396 | + /** | ||
| 397 | + * 上传分块成功 | ||
| 398 | + * @param i Http请求返回的状态码 | ||
| 399 | + * @param headers Http请求响应报头 | ||
| 400 | + * @param cnPartETag | ||
| 401 | + */ | ||
| 348 | @Override | 402 | @Override |
| 349 | public void onSuccess(int i, Header[] headers, CNPartETag cnPartETag) { | 403 | public void onSuccess(int i, Header[] headers, CNPartETag cnPartETag) { |
| 350 | //上传分块成功 | 404 | //上传分块成功 |
| @@ -357,6 +411,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -357,6 +411,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 357 | myHandler.sendMessage(message); | 411 | myHandler.sendMessage(message); |
| 358 | } | 412 | } |
| 359 | 413 | ||
| 414 | + /** | ||
| 415 | + * 上传分块失败 | ||
| 416 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 417 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 418 | + * @param headers Http请求响应报头 | ||
| 419 | + * @param s 失败时返回的响应正文 | ||
| 420 | + * @param throwable 出错时抛出的异常 | ||
| 421 | + */ | ||
| 360 | @Override | 422 | @Override |
| 361 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 423 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 362 | //上传分块失败 | 424 | //上传分块失败 |
| @@ -374,6 +436,10 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -374,6 +436,10 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 374 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 436 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 375 | } | 437 | } |
| 376 | 438 | ||
| 439 | + /** | ||
| 440 | + * 上传分块的进度 | ||
| 441 | + * @param v 上传分块的进度 | ||
| 442 | + */ | ||
| 377 | @Override | 443 | @Override |
| 378 | public void onTaskProgress(double v) { | 444 | public void onTaskProgress(double v) { |
| 379 | //上传分块进度 | 445 | //上传分块进度 |
| @@ -415,14 +481,22 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -415,14 +481,22 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 415 | /** | 481 | /** |
| 416 | * 罗列出已经上传的块 | 482 | * 罗列出已经上传的块 |
| 417 | * | 483 | * |
| 418 | - * @param request | ||
| 419 | - * @param item | 484 | + * @param request 请求封装类,应包含uploadId, |
| 485 | + * 上传的文件及其指定offset和size信息 | ||
| 486 | + * @param item 自定义文件对象 | ||
| 420 | */ | 487 | */ |
| 421 | private void listParts(CNListPartsRequest request, final UploadFile item) { | 488 | private void listParts(CNListPartsRequest request, final UploadFile item) { |
| 422 | cnUpload.listParts(request, new CNListPartsResponseListener() { | 489 | cnUpload.listParts(request, new CNListPartsResponseListener() { |
| 490 | + /** | ||
| 491 | + * 罗列已经上传的分块失败 | ||
| 492 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 493 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 494 | + * @param headers Http请求响应报头 | ||
| 495 | + * @param s 失败时返回的响应正文 | ||
| 496 | + * @param throwable 出错时抛出的异常 | ||
| 497 | + */ | ||
| 423 | @Override | 498 | @Override |
| 424 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 499 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 425 | - //罗列已经上传的分块失败 | ||
| 426 | List<UploadFile> uploadFiles = dataSource.get(currentDir | 500 | List<UploadFile> uploadFiles = dataSource.get(currentDir |
| 427 | .getPath()); | 501 | .getPath()); |
| 428 | for (UploadFile file : uploadFiles) { | 502 | for (UploadFile file : uploadFiles) { |
| @@ -435,9 +509,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -435,9 +509,14 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 435 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); | 509 | myHandler.sendEmptyMessage(UPDATE_SINGLE_UPLOAD_STATUS); |
| 436 | } | 510 | } |
| 437 | 511 | ||
| 512 | + /** | ||
| 513 | + *罗列已经上传的分块成功 | ||
| 514 | + * @param i Http请求返回的状态码 | ||
| 515 | + * @param headers Http请求响应报头 | ||
| 516 | + * @param cnListPartsResult 成功时返回CNListPartsResult结果实体类,包含CNOwner及一个Parts容器类 | ||
| 517 | + */ | ||
| 438 | @Override | 518 | @Override |
| 439 | public void onSuccess(int i, Header[] headers, CNListPartsResult cnListPartsResult) { | 519 | public void onSuccess(int i, Header[] headers, CNListPartsResult cnListPartsResult) { |
| 440 | - //罗列已经上传的分块成功 | ||
| 441 | Message message = myHandler.obtainMessage(); | 520 | Message message = myHandler.obtainMessage(); |
| 442 | message.what = LIST_PART_FINISH; | 521 | message.what = LIST_PART_FINISH; |
| 443 | message.obj = cnListPartsResult; | 522 | message.obj = cnListPartsResult; |
| @@ -452,11 +531,20 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -452,11 +531,20 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 452 | /** | 531 | /** |
| 453 | * 完成分块上传,组装上传的分块 | 532 | * 完成分块上传,组装上传的分块 |
| 454 | * | 533 | * |
| 455 | - * @param request | ||
| 456 | - * @param item | 534 | + * @param request 请求封装类,应包含uploadId, |
| 535 | + * 上传的文件及其指定offset和size信息 | ||
| 536 | + * @param item 自定义文件对象 | ||
| 457 | */ | 537 | */ |
| 458 | private void completeUploadPart(CNCompleteMultipartUploadRequest request, final UploadFile item) { | 538 | private void completeUploadPart(CNCompleteMultipartUploadRequest request, final UploadFile item) { |
| 459 | cnUpload.completeMultipartUpload(request, new CNCompleteMultipartUploadResponseListener() { | 539 | cnUpload.completeMultipartUpload(request, new CNCompleteMultipartUploadResponseListener() { |
| 540 | + /** | ||
| 541 | + * 组装上传的分块失败 | ||
| 542 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 543 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 544 | + * @param headers Http请求响应报头 | ||
| 545 | + * @param s 失败时返回的响应正文 | ||
| 546 | + * @param throwable 出错时抛出的异常 | ||
| 547 | + */ | ||
| 460 | @Override | 548 | @Override |
| 461 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 549 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 462 | List<UploadFile> uploadFiles = dataSource | 550 | List<UploadFile> uploadFiles = dataSource |
| @@ -473,6 +561,13 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -473,6 +561,13 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 473 | myHandler.sendEmptyMessage(0); | 561 | myHandler.sendEmptyMessage(0); |
| 474 | } | 562 | } |
| 475 | 563 | ||
| 564 | + /** | ||
| 565 | + * | ||
| 566 | + * @param i Http请求返回的状态码 | ||
| 567 | + * @param headers Http请求响应报头 | ||
| 568 | + * @param cnCompleteMultipartUploadResult 成功时返回结果实体类,包含上传的文件的基本信息(objectKey、uploadId等) | ||
| 569 | + | ||
| 570 | + */ | ||
| 476 | @Override | 571 | @Override |
| 477 | public void onSuccess(int i, Header[] headers, CNCompleteMultipartUploadResult cnCompleteMultipartUploadResult) { | 572 | public void onSuccess(int i, Header[] headers, CNCompleteMultipartUploadResult cnCompleteMultipartUploadResult) { |
| 478 | List<UploadFile> uploadFiles = dataSource | 573 | List<UploadFile> uploadFiles = dataSource |
| @@ -493,15 +588,29 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -493,15 +588,29 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 493 | 588 | ||
| 494 | /** | 589 | /** |
| 495 | * 取消分块上传 | 590 | * 取消分块上传 |
| 591 | + * 取消后下一次需要重新上传 | ||
| 496 | */ | 592 | */ |
| 497 | private void abortMultiUpload() { | 593 | private void abortMultiUpload() { |
| 498 | CNAbortMultipartUploadRequest request = new CNAbortMultipartUploadRequest(localUploadPartRequestFactory.getObjectKey(), localUploadPartRequestFactory.getUploadId()); | 594 | CNAbortMultipartUploadRequest request = new CNAbortMultipartUploadRequest(localUploadPartRequestFactory.getObjectKey(), localUploadPartRequestFactory.getUploadId()); |
| 499 | cnUpload.abortMultipartUpload(request, new CNAbortMultipartUploadResponseListener() { | 595 | cnUpload.abortMultipartUpload(request, new CNAbortMultipartUploadResponseListener() { |
| 596 | + /** | ||
| 597 | + * 取消分块上传失败 | ||
| 598 | + * @param i Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误 | ||
| 599 | + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError | ||
| 600 | + * @param headers Http请求响应报头 | ||
| 601 | + * @param s 失败时返回的响应正文 | ||
| 602 | + * @param throwable 出错时抛出的异常 | ||
| 603 | + */ | ||
| 500 | @Override | 604 | @Override |
| 501 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { | 605 | public void onFailure(int i, UploadError uploadError, Header[] headers, String s, Throwable throwable) { |
| 502 | Toast.makeText(UploadActivity.this, "取消分块上传失败", Toast.LENGTH_SHORT).show(); | 606 | Toast.makeText(UploadActivity.this, "取消分块上传失败", Toast.LENGTH_SHORT).show(); |
| 503 | } | 607 | } |
| 504 | 608 | ||
| 609 | + /** | ||
| 610 | + * 取消分块上传成功 | ||
| 611 | + * @param i Http请求返回的状态码 | ||
| 612 | + * @param headers Http请求响应报头 | ||
| 613 | + */ | ||
| 505 | @Override | 614 | @Override |
| 506 | public void onSuccess(int i, Header[] headers) { | 615 | public void onSuccess(int i, Header[] headers) { |
| 507 | Toast.makeText(UploadActivity.this, "取消分块上传成功", Toast.LENGTH_SHORT).show(); | 616 | Toast.makeText(UploadActivity.this, "取消分块上传成功", Toast.LENGTH_SHORT).show(); |
| @@ -532,6 +641,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -532,6 +641,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 532 | requestFactory = (UploadPartRequestFactory) bundle | 641 | requestFactory = (UploadPartRequestFactory) bundle |
| 533 | .get("requestFactory"); | 642 | .get("requestFactory"); |
| 534 | item = (UploadFile) bundle.get("uploadFile"); | 643 | item = (UploadFile) bundle.get("uploadFile"); |
| 644 | + //上传分块 | ||
| 535 | uploadpart(requestFactory, item); | 645 | uploadpart(requestFactory, item); |
| 536 | break; | 646 | break; |
| 537 | case UPLOAD_PART_FINISH: | 647 | case UPLOAD_PART_FINISH: |
| @@ -540,8 +650,10 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -540,8 +650,10 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 540 | .get("requestFactory"); | 650 | .get("requestFactory"); |
| 541 | item = (UploadFile) bundle.get("uploadFile"); | 651 | item = (UploadFile) bundle.get("uploadFile"); |
| 542 | CNListPartsRequest listRequest = new CNListPartsRequest( | 652 | CNListPartsRequest listRequest = new CNListPartsRequest( |
| 543 | - requestFactory.getObjectKey(), | ||
| 544 | - requestFactory.getUploadId()); | 653 | + requestFactory.getObjectKey(),//指定的object键 |
| 654 | + requestFactory.getUploadId() //初始化多块上传得到的uploadId | ||
| 655 | + ); | ||
| 656 | + //罗列已上传的块 | ||
| 545 | listParts(listRequest, item); | 657 | listParts(listRequest, item); |
| 546 | break; | 658 | break; |
| 547 | case LIST_PART_FINISH: | 659 | case LIST_PART_FINISH: |
| @@ -550,6 +662,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -550,6 +662,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 550 | item = (UploadFile) bundle.get("uploadFile"); | 662 | item = (UploadFile) bundle.get("uploadFile"); |
| 551 | CNCompleteMultipartUploadRequest comRequest = new CNCompleteMultipartUploadRequest( | 663 | CNCompleteMultipartUploadRequest comRequest = new CNCompleteMultipartUploadRequest( |
| 552 | listResult); | 664 | listResult); |
| 665 | + //组装分块 | ||
| 553 | completeUploadPart(comRequest, item); | 666 | completeUploadPart(comRequest, item); |
| 554 | break; | 667 | break; |
| 555 | default: | 668 | default: |
| @@ -571,7 +684,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -571,7 +684,7 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 571 | cnUpload.getUploadedUrlInfo(objectKey, FileType.COMMON_FILE, new OnUploadedUrlInfoListener() { | 684 | cnUpload.getUploadedUrlInfo(objectKey, FileType.COMMON_FILE, new OnUploadedUrlInfoListener() { |
| 572 | /** | 685 | /** |
| 573 | * 返回资源路径 | 686 | * 返回资源路径 |
| 574 | - * @param s | 687 | + * @param s 资源路径 |
| 575 | */ | 688 | */ |
| 576 | @Override | 689 | @Override |
| 577 | public void onSuccess(String s) { | 690 | public void onSuccess(String s) { |
| @@ -580,8 +693,8 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | @@ -580,8 +693,8 @@ public class UploadActivity extends Activity implements AdapterView.OnItemClickL | ||
| 580 | 693 | ||
| 581 | /** | 694 | /** |
| 582 | * 返回错误信息 | 695 | * 返回错误信息 |
| 583 | - * @param s | ||
| 584 | - * @param s1 | 696 | + * @param s 返回errorCode |
| 697 | + * @param s1 返回errorMessage | ||
| 585 | */ | 698 | */ |
| 586 | @Override | 699 | @Override |
| 587 | public void onError(String s, String s1) { | 700 | public void onError(String s, String s1) { |
app/src/main/java/com/cnlive/cnUploadDemo/model/UploadFile.java
| @@ -7,26 +7,95 @@ import java.io.Serializable; | @@ -7,26 +7,95 @@ import java.io.Serializable; | ||
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | * Created by Lynn on 2017/8/10. | 9 | * Created by Lynn on 2017/8/10. |
| 10 | + * 自定义文件对象 | ||
| 10 | */ | 11 | */ |
| 11 | 12 | ||
| 12 | public class UploadFile implements Serializable { | 13 | public class UploadFile implements Serializable { |
| 13 | public static final long serialVersionUID = 1L; | 14 | public static final long serialVersionUID = 1L; |
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 文件上传未开始 | ||
| 18 | + */ | ||
| 14 | public static final int STATUS_NOT_START = 0; | 19 | public static final int STATUS_NOT_START = 0; |
| 20 | + | ||
| 21 | + /** | ||
| 22 | + * 准备上传 | ||
| 23 | + */ | ||
| 15 | public static final int STATUS_STARTED = 1; | 24 | public static final int STATUS_STARTED = 1; |
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * 上传中 | ||
| 28 | + */ | ||
| 16 | public static final int STATUS_UPLOADING = 2; | 29 | public static final int STATUS_UPLOADING = 2; |
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * 初始化完成 | ||
| 33 | + */ | ||
| 17 | public static final int STATUS_INIT = 3; | 34 | public static final int STATUS_INIT = 3; |
| 35 | + | ||
| 36 | + /** | ||
| 37 | + * 分块上传 | ||
| 38 | + */ | ||
| 18 | public static final int STATUS_UPLOADPART = 4; | 39 | public static final int STATUS_UPLOADPART = 4; |
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * 获取上传的快 | ||
| 43 | + */ | ||
| 19 | public static final int STATUS_LISTING = 5; | 44 | public static final int STATUS_LISTING = 5; |
| 45 | + | ||
| 46 | + /** | ||
| 47 | + * 合并完成 | ||
| 48 | + */ | ||
| 20 | public static final int STATUS_COMPLETE = 6; | 49 | public static final int STATUS_COMPLETE = 6; |
| 50 | + | ||
| 51 | + /** | ||
| 52 | + * 完成上传 | ||
| 53 | + */ | ||
| 21 | public static final int STATUS_FINISH = 7; | 54 | public static final int STATUS_FINISH = 7; |
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 上传失败 | ||
| 58 | + */ | ||
| 22 | public static final int STATUS_FAIL = 8; | 59 | public static final int STATUS_FAIL = 8; |
| 60 | + | ||
| 61 | + /** | ||
| 62 | + * 上传失败 | ||
| 63 | + */ | ||
| 23 | public static final int STATUS_INIT_FAIL = 9; | 64 | public static final int STATUS_INIT_FAIL = 9; |
| 65 | + | ||
| 66 | + /** | ||
| 67 | + * 分块上传失败 | ||
| 68 | + */ | ||
| 24 | public static final int STATUS_UPLOADPART_FAIL = 10; | 69 | public static final int STATUS_UPLOADPART_FAIL = 10; |
| 70 | + | ||
| 71 | + /** | ||
| 72 | + * 获取块失败 | ||
| 73 | + */ | ||
| 25 | public static final int STATUS_LISTING_FAIL = 11; | 74 | public static final int STATUS_LISTING_FAIL = 11; |
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * 文件合并失败 | ||
| 78 | + */ | ||
| 26 | public static final int STATUS_COMPLETE_FAIL = 12; | 79 | public static final int STATUS_COMPLETE_FAIL = 12; |
| 80 | + | ||
| 81 | + /** | ||
| 82 | + * 文件icon | ||
| 83 | + */ | ||
| 27 | public Drawable icon; | 84 | public Drawable icon; |
| 85 | + | ||
| 86 | + /** | ||
| 87 | + * 文件 | ||
| 88 | + */ | ||
| 28 | public File file; | 89 | public File file; |
| 90 | + | ||
| 91 | + /** | ||
| 92 | + * 上传进度 | ||
| 93 | + */ | ||
| 29 | public int progress; | 94 | public int progress; |
| 95 | + | ||
| 96 | + /** | ||
| 97 | + * 上传状态 | ||
| 98 | + */ | ||
| 30 | public int status; | 99 | public int status; |
| 31 | 100 | ||
| 32 | @Override | 101 | @Override |
app/src/main/java/com/cnlive/cnUploadDemo/utils/UploadPartRequestFactory.java
| @@ -6,62 +6,94 @@ import java.io.File; | @@ -6,62 +6,94 @@ import java.io.File; | ||
| 6 | import java.io.Serializable; | 6 | import java.io.Serializable; |
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | - * | ||
| 10 | * UploadPartRequest工厂,用于分块上传操作 | 9 | * UploadPartRequest工厂,用于分块上传操作 |
| 11 | - * | ||
| 12 | */ | 10 | */ |
| 13 | -public class UploadPartRequestFactory implements Serializable{ | ||
| 14 | - private static final long serialVersionUID = 1L; | ||
| 15 | - private String key; | ||
| 16 | - private String uploadId; | ||
| 17 | - private File file; | ||
| 18 | - public int partNumber = 1; | ||
| 19 | - private long offset = 0L; | ||
| 20 | - private long remainingBytes; | ||
| 21 | - public long partSize ; | ||
| 22 | - private long uploadedSize; | ||
| 23 | - | ||
| 24 | - public UploadPartRequestFactory(String objectKey , String uploadId , File file , long partSize ) { | ||
| 25 | - this.uploadId = uploadId; | ||
| 26 | - this.key = objectKey; | ||
| 27 | - this.file = file; | ||
| 28 | - this.remainingBytes = file.length(); | ||
| 29 | - this.partSize = partSize; | ||
| 30 | - this.partNumber = 1; | ||
| 31 | - this.uploadedSize = 0; | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | - public synchronized boolean hasMoreRequests() { | ||
| 35 | - return this.remainingBytes > 0L; | ||
| 36 | - } | ||
| 37 | - | ||
| 38 | - // 计算下一个UploadPartRequest配置参数,并返回对象 | ||
| 39 | - public synchronized CNUploadPartRequest getNextUploadPartRequest() { | ||
| 40 | - boolean bool = this.remainingBytes - this.partSize <= 0L; | ||
| 41 | - CNUploadPartRequest localUploadPartRequest = null; | ||
| 42 | - uploadedSize = file.length() - this.remainingBytes ; | ||
| 43 | - localUploadPartRequest = new CNUploadPartRequest( key,uploadId, file, offset, partNumber++, partSize); | ||
| 44 | - this.offset += partSize; | ||
| 45 | - this.remainingBytes -= partSize; | ||
| 46 | - localUploadPartRequest.setLastPart(bool); | ||
| 47 | - return localUploadPartRequest; | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | - | ||
| 51 | - public synchronized long getUploadedSize (){ | ||
| 52 | - return this.uploadedSize; | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - public synchronized File getFile(){ | ||
| 56 | - return this.file; | ||
| 57 | - } | ||
| 58 | - | ||
| 59 | - public synchronized String getUploadId(){ | ||
| 60 | - return this.uploadId; | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - public synchronized String getObjectKey() { | ||
| 64 | - return this.key; | ||
| 65 | - } | ||
| 66 | - | 11 | +public class UploadPartRequestFactory implements Serializable { |
| 12 | + | ||
| 13 | + private static final long serialVersionUID = 1L; | ||
| 14 | + /** | ||
| 15 | + * 指定的Object键 | ||
| 16 | + */ | ||
| 17 | + private String key; | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 初始化时得到的uploadId | ||
| 21 | + */ | ||
| 22 | + private String uploadId; | ||
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * 需要上传的file | ||
| 26 | + */ | ||
| 27 | + private File file; | ||
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * 此分块是第几块 | ||
| 31 | + */ | ||
| 32 | + public int partNumber = 1; | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * 此分块在文件中内容的起始位置 | ||
| 36 | + */ | ||
| 37 | + private long offset = 0L; | ||
| 38 | + | ||
| 39 | + /** | ||
| 40 | + * 剩余大小 | ||
| 41 | + */ | ||
| 42 | + private long remainingBytes; | ||
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * 此分块的大小,单位为Byte | ||
| 46 | + */ | ||
| 47 | + public long partSize; | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * 已经上传大小 | ||
| 51 | + */ | ||
| 52 | + private long uploadedSize; | ||
| 53 | + | ||
| 54 | + public UploadPartRequestFactory(String objectKey, String uploadId, File file, long partSize) { | ||
| 55 | + this.uploadId = uploadId; | ||
| 56 | + this.key = objectKey; | ||
| 57 | + this.file = file; | ||
| 58 | + this.remainingBytes = file.length(); | ||
| 59 | + this.partSize = partSize; | ||
| 60 | + this.partNumber = 1; | ||
| 61 | + this.uploadedSize = 0; | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + public synchronized boolean hasMoreRequests() { | ||
| 65 | + return this.remainingBytes > 0L; | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + // 计算下一个UploadPartRequest配置参数,并返回对象 | ||
| 69 | + public synchronized CNUploadPartRequest getNextUploadPartRequest() { | ||
| 70 | + boolean bool = this.remainingBytes - this.partSize <= 0L; | ||
| 71 | + CNUploadPartRequest localUploadPartRequest = null; | ||
| 72 | + uploadedSize = file.length() - this.remainingBytes; | ||
| 73 | + | ||
| 74 | + localUploadPartRequest = new CNUploadPartRequest(key, uploadId, file, offset, partNumber++, partSize); | ||
| 75 | + | ||
| 76 | + this.offset += partSize; | ||
| 77 | + this.remainingBytes -= partSize; | ||
| 78 | + localUploadPartRequest.setLastPart(bool); | ||
| 79 | + return localUploadPartRequest; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + | ||
| 83 | + public synchronized long getUploadedSize() { | ||
| 84 | + return this.uploadedSize; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + public synchronized File getFile() { | ||
| 88 | + return this.file; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + public synchronized String getUploadId() { | ||
| 92 | + return this.uploadId; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public synchronized String getObjectKey() { | ||
| 96 | + return this.key; | ||
| 97 | + } | ||
| 98 | + | ||
| 67 | } | 99 | } |