Skip to content

Commit f71ea78

Browse files
authored
Merge pull request #246 from jemygraw/master
add resume upload record progress function
2 parents 477330b + 19569cd commit f71ea78

File tree

4 files changed

+46
-33
lines changed

4 files changed

+46
-33
lines changed

examples/resume_upload_simple.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ putExtra.params = {
2222
"x:age": 27,
2323
}
2424
putExtra.fname = 'testfile.mp4';
25+
putExtra.resumeRecordFile = 'progress.log';
2526

2627
//file
2728
resumeUploader.putFile(uploadToken, null, localFile, putExtra, function(respErr,

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"formstream": "1.1.0",
5555
"crc32": "0.2.2",
5656
"urllib": "2.22.0",
57+
"agentkeepalive": "3.3.0",
5758
"urlencode": "1.1.0"
5859
},
5960
"devDependencies": {

qiniu/io/resume.js

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,19 @@ function ResumeUploader(config) {
1414
}
1515

1616
// 上传可选参数
17-
// @params fname 请求体中的文件的名称
18-
// @params params 额外参数设置,参数名称必须以x:开头
19-
// @param mimeType 指定文件的mimeType
17+
// @params fname 请求体中的文件的名称
18+
// @params params 额外参数设置,参数名称必须以x:开头
19+
// @param mimeType 指定文件的mimeType
20+
// @param resumeRecordFile 断点续传的已上传的部分信息记录文件
2021
// @param progressCallback(BlkputRet) 上传进度回调
21-
// @param ctxList 断点续传的已上传的文件ctx列表,
22-
// 在上传的过程中可以在progressCallback中写入本地文件
23-
function PutExtra(fname, params, mimeType, blkputRets, progressCallback) {
22+
function PutExtra(fname, params, mimeType, resumeRecordFile, progressCallback) {
2423
this.fname = fname || '';
2524
this.params = params || {};
2625
this.mimeType = mimeType || null;
27-
this.blkputRets = blkputRets || [];
26+
this.resumeRecordFile = resumeRecordFile || null;
2827
this.progressCallback = progressCallback || null;
2928
}
3029

31-
function BlkputRet(options) {
32-
this.ctx = options.ctx || null;
33-
this.checksum = options.checksum || null;
34-
this.crc32 = options.crc32 || null;
35-
this.offset = options.offset || null;
36-
this.host = options.host || null;
37-
this.expired_at = options.expired_at || null;
38-
}
39-
4030
ResumeUploader.prototype.putStream = function(uploadToken, key, rsStream,
4131
rsStreamLen, putExtra, callbackFunc) {
4232
putExtra = putExtra || new PutExtra();
@@ -128,23 +118,28 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
128118
var readLen = 0;
129119
var readBuffers = [];
130120
var finishedCtxList = [];
121+
var finishedBlkPutRets = [];
122+
//read resumeRecordFile
123+
if (putExtra.resumeRecordFile) {
124+
try {
125+
var resumeRecords = fs.readFileSync(putExtra.resumeRecordFile).toString();
126+
var blkputRets = JSON.parse(resumeRecords);
131127

132-
//check putExtra.blkputRets
133-
if (putExtra.blkputRets) {
134-
for (var index = 0; index < putExtra.blkputRets.length; index++) {
135-
//check ctx expired or not
136-
var blkputRet = putExtra.blkputRets[index];
137-
var expiredAt = blkputRet.expired_at;
138-
//make sure the ctx at least has one day expiration
139-
expiredAt += 3600 * 24;
140-
if (util.isTimestampExpired(expiredAt)) {
141-
//discard these ctxs
142-
break;
143-
}
128+
for (var index = 0; index < blkputRets.length; index++) {
129+
//check ctx expired or not
130+
var blkputRet = blkputRets[index];
131+
var expiredAt = blkputRet.expired_at;
132+
//make sure the ctx at least has one day expiration
133+
expiredAt += 3600 * 24;
134+
if (util.isTimestampExpired(expiredAt)) {
135+
//discard these ctxs
136+
break;
137+
}
144138

145-
finishedBlock += 1;
146-
finishedCtxList.push(blkputRet.ctx);
147-
}
139+
finishedBlock += 1;
140+
finishedCtxList.push(blkputRet.ctx);
141+
}
142+
} catch (e) {}
148143
}
149144

150145
//check when to mkblk
@@ -170,9 +165,17 @@ function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
170165
rsStream.resume();
171166
var blkputRet = respBody;
172167
finishedCtxList.push(blkputRet.ctx);
168+
finishedBlkPutRets.push(blkputRet);
173169
if (putExtra.progressCallback) {
174170
putExtra.progressCallback(blkputRet);
175171
}
172+
if (putExtra.resumeRecordFile) {
173+
var contents = JSON.stringify(finishedBlkPutRets);
174+
console.log("write resume record " + putExtra.resumeRecordFile)
175+
fs.writeFileSync(putExtra.resumeRecordFile, contents, {
176+
encoding: 'utf-8'
177+
});
178+
}
176179
}
177180
});
178181
}
@@ -226,7 +229,15 @@ function mkfileReq(upDomain, uploadToken, fileSize, ctxList, key, putExtra,
226229
'Content-Type': 'application/octet-stream'
227230
}
228231
var postBody = ctxList.join(",");
229-
rpc.post(requestURI, postBody, headers, callbackFunc);
232+
rpc.post(requestURI, postBody, headers, function(err, ret, info) {
233+
if (info.statusCode == 200 || info.statusCode == 701 ||
234+
info.statusCode == 401) {
235+
if (putExtra.resumeRecordFile) {
236+
fs.unlinkSync(putExtra.resumeRecordFile);
237+
}
238+
}
239+
callbackFunc(err, ret, info);
240+
});
230241
}
231242

232243
ResumeUploader.prototype.putFile = function(uploadToken, key, localFile,

qiniu/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var conf = require('./conf');
44

55
// Check Timestamp Expired or not
66
exports.isTimestampExpired = function(timestamp) {
7-
return timestamp > parseInt(Date.now() / 1000);
7+
return timestamp < parseInt(Date.now() / 1000);
88
}
99

1010
// Encoded Entry

0 commit comments

Comments
 (0)