下载对象
功能说明
下载指定桶中的对象。
方法定义
ObsClient.getObject
请求参数
字段名 |
类型 |
约束 |
说明 |
---|---|---|---|
Bucket |
String |
必选 |
桶名。 |
Key |
String |
必选 |
对象名。 |
VersionId |
String |
可选 |
对象的版本号。 |
ProgressCallback |
Function |
可选 |
获取下载进度的回调函数。 该回调函数依次包含三个参数:已下载字节数、总字节数、已使用的时间(单位:秒)。 |
IfMatch |
String |
可选 |
如果对象的ETag值与该参数值相同,则返回对象内容,否则返回异常码。 |
IfModifiedSince |
String |
可选 |
如果对象的修改时间晚于该参数值指定的时间,则返回对象内容,否则返回异常码。该参数值必须符合http://www.ietf.org/rfc/rfc2616.txt规定的HTTP时间格式。 |
IfNoneMatch |
String |
可选 |
如果对象的ETag值与该参数值不相同,则返回对象内容,否则返回异常码。 |
IfUnmodifiedSince |
String |
可选 |
如果对象的修改时间早于该参数值指定的时间,则返回对象内容,否则返回异常码。该参数值必须符合http://www.ietf.org/rfc/rfc2616.txt规定的HTTP时间格式。 |
Range |
String |
可选 |
指定下载的范围,取值区间:[0,对象长度-1],格式:bytes=x-y。如果Range的最大长度超出对象长度-1,仍旧取对象长度-1。 |
Origin |
String |
可选 |
预请求指定的跨域请求Origin(通常为域名)。 |
RequestHeader |
String |
可选 |
跨域请求可以使用的HTTP头域。 |
ResponseCacheControl |
String |
可选 |
重写响应中的Cache-Control头。 |
ResponseContentDisposition |
String |
可选 |
重写响应中的Content-Disposition头。 |
ResponseContentEncoding |
String |
可选 |
重写响应中的Content-Encoding头。 |
ResponseContentLanguage |
String |
可选 |
重写响应中的Content-Language头。 |
ResponseContentType |
String |
可选 |
重写响应中的Content-Type头。 |
ResponseExpires |
String |
可选 |
重写响应中的Expires头。 |
ImageProcess |
String |
可选 |
图片处理参数。 |
SaveAsFile |
String |
可选 |
下载对象的目标路径,包含文件名。 |
SaveAsStream |
Boolean |
可选 |
是否将对象以流(stream.Readable)的形式返回。 |
SseC |
String |
可选 |
以SSE-C方式解密对象,支持的值:
|
SseCKey |
Buffer |
可选 |
SSE-C方式下解密的密钥,由AES256算法算出。 |
- SaveAsFile和SaveAsStream不能同时使用。
- 如果包含IfUnmodifiedSince并且不符合或者包含IfMatch并且不符合,抛出异常中HTTP状态码为:412 precondition failed。
- 如果包含IfModifiedSince并且不符合或者包含IfNoneMatch并且不符合,抛出异常中HTTP状态码为:304 Not Modified。
返回结果(InterfaceResult)
字段名 |
类型 |
说明 |
---|---|---|
RequestId |
String |
OBS服务端返回的请求ID。 |
DeleteMarker |
String |
标识删除的对象是否是删除标记。 |
LastModified |
String |
对象的最近一次修改时间。 |
ContentLength |
String |
对象数据的长度。 |
CacheControl |
String |
响应中的Cache-Control头。 |
ContentDisposition |
String |
响应中的Content-Disposition头。 |
ContentEncoding |
String |
响应中的Content-Encoding头 |
ContentLanguage |
String |
响应中的Content-Language头 |
ContentType |
String |
对象的MIME类型。 |
Expires |
String |
响应中的Expires头。 |
ETag |
String |
对象的ETag值。 |
VersionId |
String |
对象的版本号。 |
WebsiteRedirectLocation |
String |
当桶设置了Website配置,该参数指明对象的重定向地址。 |
StorageClass |
String |
对象的存储类型,当对象存储类型是标准存储时,该值为空。 |
Restore |
String |
归档存储类型对象的取回状态。 |
AllowOrigin |
String |
如果请求中的Origin满足桶的CORS规则,则返回CORS规则中的AllowedOrigin。 |
AllowHeader |
String |
如果请求的RequestHeader满足桶的CORS规则,则返回CORS规则中的AllowedHeader。 |
AllowMethod |
String |
桶CORS规则中的AllowedMethod。 |
ExposeHeader |
String |
桶CORS规则中的ExposeHeader。 |
MaxAgeSeconds |
String |
桶CORS规则中的MaxAgeSeconds。 |
SseKms |
String |
SSE-KMS方式的算法。 |
SseKmsKey |
String |
SSE-KMS方式的主密钥。 |
SseC |
String |
SSE-C方式的算法。 |
SseCKeyMd5 |
String |
SSE-C方式的密钥的MD5值。 |
Expiration |
String |
对象的详细过期信息。 |
Content |
String 或 stream.Readable |
对象的内容。当设置了SaveAsFile时该值为空;当设置了SaveAsStream且为true时该值为stream.Readable对象;当SaveAsFile和SaveAsStream都未设置时为Buffer对象。 |
Metadata |
Object |
对象自定义元数据。 |
代码样例
本示例用于范围下载examplebucket桶里的objectname对象的0-1023字节并打印进度。
// 使用npm安装
var ObsClient = require('esdk-obs-nodejs');
// 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险
// 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
const AK = process.env.AccessKeyID
const SK = process.env.SecretAccessKey
// 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
const security_token= process.env.SecurityToken
// server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
const server = "https://obs.cn-north-4.myhuaweicloud.com"
var obsClient = new ObsClient({
access_key_id: AK,
secret_access_key: SK,
server: server,
});
const Bucket = 'examplebucket'
// 对象名
const Key = 'objectname'
// 指定下载的范围,取值区间:[0,对象长度-1],格式:bytes=x-y。如果Range的最大长度超出对象长度-1,仍旧取对象长度-1。
const Range = 'bytes=0-1023'
// 下载对象的目标路径,包含文件名。
const SaveAsFile = 'D:\\example'
try {
obsClient.getObject({
Bucket,
Key,
Range,
SaveAsFile,
// 进度回调
ProgressCallback: function (transferredAmount, totalAmount, totalSeconds) {
// 打印下载速度,单位KB/S
console.log(transferredAmount * 1.0 / totalSeconds / 1024);
// 打印上传百分比
console.log(transferredAmount * 100.0 / totalAmount);
},
// 是否将对象以流(stream.Readable)的形式返回。
// SaveAsStream: true
}, (err, result) => {
if (err) {
console.log('GetObject Failed')
console.error('Error-->' + err);
} else {
if (result.CommonMsg.Status < 300) {
console.log('GetObject Succeeded')
console.log('RequestId-->' + result.InterfaceResult.RequestId);
console.log('ETag-->' + result.InterfaceResult.ETag);
// 多版本对象独有
console.log('VersionId-->' + result.InterfaceResult.VersionId);
console.log('ContentLength-->' + result.InterfaceResult.ContentLength);
// 多版本对象独有
console.log('DeleteMarker-->' + result.InterfaceResult.DeleteMarker);
console.log('LastModified-->' + result.InterfaceResult.LastModified);
// 对象的存储类型,当对象存储类型是标准存储时,该值为空
console.log('StorageClass-->' + result.InterfaceResult.StorageClass);
// console.log('Content-->' + result.InterfaceResult.Content.toString());
console.log('Metadata-->' + JSON.stringify(result.InterfaceResult.Metadata));
} else {
console.log('GetObject Failed')
console.log('ErrorCode-->' + result.CommonMsg.Code);
console.log('ErrorMessage-->' + result.CommonMsg.Message);
}
}
});
} catch (error) {
console.log('GetObject Failed')
console.error('Error-->' + error);
}