cos-nodejs-sdk-v5
Advanced tools
Comparing version 2.2.6 to 2.3.0
@@ -7,2 +7,4 @@ var fs = require('fs'); | ||
var cos = new COS({ | ||
@@ -138,3 +140,3 @@ // 必选参数 | ||
"AllowedHeader": ["*"], | ||
"ExposeHeader": ["ETag"], | ||
"ExposeHeader": ["ETag", "x-cos-acl", "x-cos-version-id", "x-cos-delete-marker", "x-cos-server-side-encryption"], | ||
"MaxAgeSeconds": "5" | ||
@@ -258,8 +260,8 @@ }] | ||
'Filter': { | ||
'Prefix': 'test123', | ||
'Prefix': 'cas', | ||
}, | ||
'Status': 'Enabled', | ||
'Transition': { | ||
'Date': '2016-10-31T00:00:00+08:00', | ||
'StorageClass': 'STANDARD_IA' | ||
'Days': 0, | ||
'StorageClass': 'ARCHIVE' | ||
} | ||
@@ -313,2 +315,12 @@ }] | ||
function listObjectVersions() { | ||
cos.listObjectVersions({ | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
Prefix: "1mb.zip" | ||
}, function (err, data) { | ||
console.log(err || JSON.stringify(data, null, ' ')); | ||
}); | ||
} | ||
function putBucketReplication() { | ||
@@ -510,2 +522,18 @@ var AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1); | ||
function restoreObject() { | ||
cos.restoreObject({ | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
Key: '1.txt', | ||
RestoreRequest: { | ||
Days: 1, | ||
CASJobParameters: { | ||
Tier: 'Expedited' | ||
} | ||
} | ||
}, function (err, data) { | ||
console.log(err || data); | ||
}); | ||
} | ||
function abortUploadTask() { | ||
@@ -540,2 +568,5 @@ cos.abortUploadTask({ | ||
FilePath: filepath, /* 必须 */ | ||
Headers: { | ||
'test': '123', | ||
}, | ||
TaskReady: function (tid) { | ||
@@ -572,2 +603,36 @@ TaskId = tid; | ||
function uploadFiles() { | ||
var filename = 'mb.zip'; | ||
var blob = util.createFile({size: 1024 * 1024 * 10}); | ||
cos.uploadFiles({ | ||
files: [{ | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
Key: '1' + filename, | ||
Body: blob, | ||
}, { | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
Key: '2' + filename, | ||
Body: blob, | ||
}, { | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
Key: '3' + filename, | ||
Body: blob, | ||
}], | ||
SliceSize: 1024 * 1024, | ||
onProgress: function (info) { | ||
var percent = parseInt(info.percent * 10000) / 100; | ||
var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100; | ||
console.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;'); | ||
}, | ||
onFileFinish: function (err, data, options) { | ||
console.log(options.Key + ' 上传' + (err ? '失败' : '完成')); | ||
}, | ||
}, function (err, data) { | ||
console.log(err || data); | ||
}); | ||
} | ||
getService(); | ||
@@ -594,2 +659,3 @@ // getAuth(); | ||
// getBucketVersioning(); | ||
// listObjectVersions(); | ||
// putBucketVersioning(); | ||
@@ -608,2 +674,3 @@ // getBucketReplication(); | ||
// deleteMultipleObject(); | ||
// restoreObject(); | ||
// abortUploadTask(); | ||
@@ -614,1 +681,2 @@ // sliceUploadFile(); | ||
// restartTask(); | ||
// uploadFiles(); |
{ | ||
"name": "cos-nodejs-sdk-v5", | ||
"version": "2.2.6", | ||
"version": "2.3.0", | ||
"description": "cos nodejs sdk v5", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -17,2 +17,3 @@ var fs = require('fs'); | ||
var StorageClass = params.StorageClass || 'Standard'; | ||
var ServerSideEncryption = params.ServerSideEncryption; | ||
var FileSize; | ||
@@ -63,2 +64,3 @@ var self = this; | ||
AsyncLimit: AsyncLimit, | ||
ServerSideEncryption: ServerSideEncryption, | ||
UploadData: UploadData, | ||
@@ -84,2 +86,3 @@ onProgress: onProgress | ||
Key: Key, | ||
Headers: params.Headers, | ||
StorageClass: StorageClass, | ||
@@ -212,3 +215,3 @@ FilePath: FilePath, | ||
// 不存在 UploadId | ||
// 存在 UploadId | ||
ep.on('upload_id_ready', function (UploadData) { | ||
@@ -247,2 +250,3 @@ // 转换成 map | ||
Key: Key, | ||
Headers: params.Headers, | ||
StorageClass: StorageClass, | ||
@@ -401,2 +405,3 @@ }); | ||
var FinishSize = 0; | ||
var ServerSideEncryption = params.ServerSideEncryption; | ||
var needUploadSlices = util.filter(UploadData.PartList, function (SliceItem) { | ||
@@ -424,2 +429,3 @@ if (SliceItem['Uploaded']) { | ||
PartNumber: PartNumber, | ||
ServerSideEncryption: ServerSideEncryption, | ||
FilePath: FilePath, | ||
@@ -466,2 +472,3 @@ UploadData: UploadData, | ||
var SliceSize = params.SliceSize; | ||
var ServerSideEncryption = params.ServerSideEncryption; | ||
var UploadData = params.UploadData; | ||
@@ -496,2 +503,3 @@ var sliceRetryTimes = 3; | ||
UploadId: UploadData.UploadId, | ||
ServerSideEncryption: ServerSideEncryption, | ||
Body: Body, | ||
@@ -572,2 +580,3 @@ onProgress: params.onProgress | ||
Key: Key, | ||
Headers: params.Headers, | ||
AsyncLimit: AsyncLimit, | ||
@@ -645,2 +654,3 @@ AbortArray: AbortArray | ||
Key: AbortItem.Key, | ||
Headers: params.Headers, | ||
UploadId: UploadId | ||
@@ -686,5 +696,92 @@ }, function (err, data) { | ||
// 批量上传文件 | ||
function uploadFiles(params, callback) { | ||
var self = this; | ||
// 判断多大的文件使用分片上传 | ||
var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize; | ||
// 汇总返回进度 | ||
var TotalSize = 0; | ||
var TotalFinish = 0; | ||
var onTotalProgress = util.throttleOnProgress.call(self, TotalFinish, params.onProgress); | ||
// 汇总返回回调 | ||
var unFinishCount = params.files.length; | ||
var _onTotalFileFinish = params.onFileFinish; | ||
var resultList = Array(unFinishCount); | ||
var onTotalFileFinish = function (err, data, options) { | ||
onTotalProgress(null, true); | ||
_onTotalFileFinish && _onTotalFileFinish(err, data, options); | ||
resultList[options.Index] = { | ||
options: options, | ||
error: err, | ||
data: data | ||
}; | ||
if (--unFinishCount <= 0 && callback) { | ||
callback(null, { | ||
files: resultList, | ||
}); | ||
} | ||
}; | ||
// 开始处理每个文件 | ||
var taskList = []; | ||
util.each(params.files, function (fileParams, index) { | ||
var Body = fileParams.Body; | ||
var FileSize = Body.size || Body.length || 0; | ||
var fileInfo = {Index: index, TaskId: ''}; | ||
// 更新文件总大小 | ||
TotalSize += FileSize; | ||
// 整理 option,用于返回给回调 | ||
util.each(fileParams, function (v, k) { | ||
if (typeof v !== 'object' && typeof v !== 'function') { | ||
fileInfo[k] = v; | ||
} | ||
}); | ||
// 处理单个文件 TaskReady | ||
var _TaskReady = fileParams.TaskReady; | ||
var TaskReady = function (tid) { | ||
fileInfo.TaskId = tid; | ||
_TaskReady && _TaskReady(tid); | ||
}; | ||
fileParams.TaskReady = TaskReady; | ||
// 处理单个文件进度 | ||
var PreAddSize = 0; | ||
var _onProgress = fileParams.onProgress; | ||
var onProgress = function (info) { | ||
TotalFinish = TotalFinish - PreAddSize + info.loaded; | ||
PreAddSize = info.loaded; | ||
_onProgress && _onProgress(info); | ||
onTotalProgress({loaded: TotalFinish, total: TotalSize}); | ||
}; | ||
fileParams.onProgress = onProgress; | ||
// 处理单个文件完成 | ||
var _onFileFinish = fileParams.onFileFinish; | ||
var onFileFinish = function (err, data) { | ||
_onFileFinish && _onFileFinish(err, data); | ||
onTotalFileFinish && onTotalFileFinish(err, data, fileInfo); | ||
}; | ||
// 添加上传任务 | ||
taskList.push({ | ||
api: FileSize >= SliceSize ? 'sliceUploadFile' : 'putObject', | ||
params: fileParams, | ||
callback: onFileFinish, | ||
}); | ||
}); | ||
self._addTasks(taskList); | ||
} | ||
var API_MAP = { | ||
sliceUploadFile: sliceUploadFile, | ||
abortUploadTask: abortUploadTask, | ||
uploadFiles: uploadFiles, | ||
}; | ||
@@ -691,0 +788,0 @@ |
@@ -21,2 +21,3 @@ 'use strict'; | ||
ServiceDomain: '', | ||
SliceSize: 1024 * 1024 * 20, | ||
Proxy: '', | ||
@@ -23,0 +24,0 @@ }; |
@@ -219,3 +219,3 @@ 'use strict'; | ||
var object = params.Key; | ||
if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList') { | ||
if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList' || apiName === 'listObjectVersions' || apiName === 'request') { | ||
return bucket && region; | ||
@@ -237,8 +237,69 @@ } | ||
return function (params, callback) { | ||
callback = callback || function () { | ||
// 处理参数 | ||
if (typeof params === 'function') { | ||
callback = params; | ||
params = {}; | ||
} | ||
// 统一处理 Headers | ||
var Headers = params.Headers || {}; | ||
if (params && typeof params === 'object') { | ||
(function () { | ||
for (var key in params) { | ||
if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) { | ||
Headers[key] = params[key]; | ||
} | ||
} | ||
})(); | ||
// params headers | ||
Headers['x-cos-mfa'] = params['MFA']; | ||
Headers['Content-MD5'] = params['ContentMD5']; | ||
Headers['Content-Length'] = params['ContentLength']; | ||
Headers['Content-Type'] = params['ContentType']; | ||
Headers['Expect'] = params['Expect']; | ||
Headers['Expires'] = params['Expires']; | ||
Headers['Cache-Control'] = params['CacheControl']; | ||
Headers['Content-Disposition'] = params['ContentDisposition']; | ||
Headers['Content-Encoding'] = params['ContentEncoding']; | ||
Headers['Range'] = params['Range']; | ||
Headers['If-Modified-Since'] = params['IfModifiedSince']; | ||
Headers['If-Unmodified-Since'] = params['IfUnmodifiedSince']; | ||
Headers['If-Match'] = params['IfMatch']; | ||
Headers['If-None-Match'] = params['IfNoneMatch']; | ||
Headers['x-cos-copy-source'] = params['CopySource']; | ||
Headers['x-cos-copy-source-Range'] = params['CopySourceRange']; | ||
Headers['x-cos-metadata-directive'] = params['MetadataDirective']; | ||
Headers['x-cos-copy-source-If-Modified-Since'] = params['CopySourceIfModifiedSince']; | ||
Headers['x-cos-copy-source-If-Unmodified-Since'] = params['CopySourceIfUnmodifiedSince']; | ||
Headers['x-cos-copy-source-If-Match'] = params['CopySourceIfMatch']; | ||
Headers['x-cos-copy-source-If-None-Match'] = params['CopySourceIfNoneMatch']; | ||
Headers['x-cos-server-side-encryption'] = params['ServerSideEncryption']; | ||
Headers['x-cos-acl'] = params['ACL']; | ||
Headers['x-cos-grant-read'] = params['GrantRead']; | ||
Headers['x-cos-grant-write'] = params['GrantWrite']; | ||
Headers['x-cos-grant-full-control'] = params['GrantFullControl']; | ||
Headers['x-cos-grant-read-acp'] = params['GrantReadAcp']; | ||
Headers['x-cos-grant-write-acp'] = params['GrantWriteAcp']; | ||
Headers['x-cos-storage-class'] = params['StorageClass']; | ||
params.Headers = Headers; | ||
} | ||
// 代理回调函数 | ||
var formatResult = function (result) { | ||
if (result && result.headers) { | ||
result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']); | ||
result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']); | ||
} | ||
return result; | ||
}; | ||
var _callback = function (err, data) { | ||
callback && callback(formatResult(err), formatResult(data)); | ||
}; | ||
if (apiName !== 'getService' && apiName !== 'abortUploadTask') { | ||
// 判断参数是否完整 | ||
if (!checkParams(apiName, params)) { | ||
callback({error: 'lack of required params'}); | ||
_callback({error: 'lack of required params'}); | ||
return; | ||
@@ -248,3 +309,3 @@ } | ||
if (params.Region && regionMap[params.Region]) { | ||
callback({error: 'Region should be ' + regionMap[params.Region]}); | ||
_callback({error: 'Region should be ' + regionMap[params.Region]}); | ||
return; | ||
@@ -254,3 +315,3 @@ } | ||
if (params.Region && params.Region.indexOf('cos.') > -1) { | ||
callback({error: 'Region should not be start with "cos."'}); | ||
_callback({error: 'Region should not be start with "cos."'}); | ||
return; | ||
@@ -266,3 +327,3 @@ } | ||
} else { | ||
callback({error: 'Bucket should format as "test-1250000000".'}); | ||
_callback({error: 'Bucket should format as "test-1250000000".'}); | ||
return; | ||
@@ -281,3 +342,3 @@ } | ||
} | ||
var res = apiFn.call(this, params, callback); | ||
var res = apiFn.call(this, params, _callback); | ||
if (apiName === 'getAuth' || apiName === 'getObjectUrl') { | ||
@@ -284,0 +345,0 @@ return res; |
@@ -14,3 +14,3 @@ var fs = require('fs'); | ||
Bucket: process.env.Bucket, // Bucket 格式:test-1250000000 | ||
Region: process.env.Region, | ||
Region: process.env.Region | ||
} | ||
@@ -21,3 +21,3 @@ } | ||
SecretId: config.SecretId, | ||
SecretKey: config.SecretKey, | ||
SecretKey: config.SecretKey | ||
}); | ||
@@ -99,3 +99,3 @@ | ||
data.Buckets && data.Buckets.forEach(function (item) { | ||
if (item.Name === BucketLongName && item.Location === config.Region) { | ||
if (item.Name === BucketLongName && (item.Location === config.Region || !item.Location)) { | ||
hasBucket = true; | ||
@@ -154,4 +154,3 @@ } | ||
}, function (err, data) { | ||
assert.ok(data.BucketExist); | ||
assert.ok(data.BucketAuth); | ||
assert.ok(data); | ||
cos.deleteBucket({ | ||
@@ -229,3 +228,13 @@ Bucket: NewBucket, | ||
assert.ok(objectContent === content); | ||
done(); | ||
cos.putObjectCopy({ | ||
Bucket: config.Bucket, // Bucket 格式:test-1250000000 | ||
Region: config.Region, | ||
//ServerSideEncryption: 'AES256', | ||
Key: '1.copy.text', | ||
CopySource: config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + filename, // Bucket 格式:test-1250000000 | ||
}, function (err, data) { | ||
assert.ok(!err); | ||
assert.ok(data.ETag.length > 0); | ||
done(); | ||
}); | ||
}); | ||
@@ -311,3 +320,10 @@ }); | ||
assert.ok(objectContent === content); | ||
done(); | ||
cos.headObject({ | ||
Bucket: config.Bucket, | ||
Region: config.Region, | ||
Key: key | ||
}, function (err, data) { | ||
assert.ok(!err); | ||
done(); | ||
}); | ||
}); | ||
@@ -314,0 +330,0 @@ }, 2000); |
Sorry, the diff of this file is too big to display
218662
5392