/* * Copyright (C) Alibaba Cloud Computing * All rights reserved. * * 版权所有 (C)阿里云计算有限公司 */ using System; using System.Collections.Generic; using Aliyun.OSS.Util; namespace Aliyun.OSS { /// /// OSS中Object的元数据。 /// /// 包含了用户自定义的元数据,也包含了OSS发送的标准HTTP头(如Content-Length, ETag等)。 /// /// public class ObjectMetadata { private readonly IDictionary _userMetadata = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly IDictionary _metadata = new Dictionary(StringComparer.OrdinalIgnoreCase); /// /// 256位的Aes加密算法 /// public const string Aes256ServerSideEncryption = "AES256"; /// /// 获取用户自定义的元数据。 /// /// /// OSS内部保存用户自定义的元数据时,会以x-oss-meta-为请求头的前缀。 /// 但用户通过该接口处理用户自定义元数据里,不需要加上前缀“x-oss-meta-”。 /// 同时,元数据字典的键名是不区分大小写的,并且在从服务器端返回时会全部以小写形式返回, /// 即使在设置时给定了大写字母。比如键名为:MyUserMeta,通过GetObjectMetadata接口 /// 返回时键名会变为:myusermeta。 /// public IDictionary UserMetadata { get { return _userMetadata; } } /// /// 获取Last-Modified请求头的值,表示Object最后一次修改的时间。 /// public DateTime LastModified { get { return _metadata.ContainsKey(HttpHeaders.LastModified) ? (DateTime)_metadata[HttpHeaders.LastModified] : DateTime.MinValue; } internal set { _metadata[HttpHeaders.LastModified] = value; } } /// /// 获取Expires请求头,表示Object的过期时间。 /// public DateTime ExpirationTime { get { return _metadata.ContainsKey(HttpHeaders.Expires) ? DateUtils.ParseRfc822Date((string)_metadata[HttpHeaders.Expires]) : DateTime.MinValue; } set { _metadata[HttpHeaders.Expires] = DateUtils.FormatRfc822Date(value); } } /// /// 获取Content-Length请求头,表示Object内容的大小。 /// public long ContentLength { get { return _metadata.ContainsKey(HttpHeaders.ContentLength) ? (long)_metadata[HttpHeaders.ContentLength] : 0; } set { if (value > OssUtils.MaxFileSize) throw new ArgumentException("content length not allow to exceed 5GB."); _metadata[HttpHeaders.ContentLength] = value; } } /// /// 获取或设置Content-Type请求头,表示Object内容的类型,为标准的MIME类型。 /// public string ContentType { get { return _metadata.ContainsKey(HttpHeaders.ContentType) ? _metadata[HttpHeaders.ContentType] as string : null; } set { if (!string.IsNullOrEmpty(value)) { _metadata[HttpHeaders.ContentType] = value; } } } /// /// 获取或设置Content-Encoding请求头,表示Object内容的编码方式。 /// public string ContentEncoding { get { return _metadata.ContainsKey(HttpHeaders.ContentEncoding) ? _metadata[HttpHeaders.ContentEncoding] as string : null; } set { if (value != null) { _metadata[HttpHeaders.ContentEncoding] = value; } } } /// /// 获取或设置Cache-Control请求头,表示用户指定的HTTP请求/回复链的缓存行为。 /// public string CacheControl { get { return _metadata.ContainsKey(HttpHeaders.CacheControl) ? _metadata[HttpHeaders.CacheControl] as string : null; } set { if (value != null) { _metadata[HttpHeaders.CacheControl] = value; } } } /// /// 获取Content-Disposition请求头,表示MIME用户代理如何显示附加的文件。 /// public string ContentDisposition { get { return _metadata.ContainsKey(HttpHeaders.ContentDisposition) ? _metadata[HttpHeaders.ContentDisposition] as string : null; } set { if (value != null) { _metadata[HttpHeaders.ContentDisposition] = value; } } } /// /// 获取或者设置ETAG值,如果要设置Content-Md5值,请使用Content-Md5属性。 /// public string ETag { get { return _metadata.ContainsKey(HttpHeaders.ETag) ? _metadata[HttpHeaders.ETag] as string : null; } set { if (value != null) { _metadata[HttpHeaders.ETag] = value; } } } /// /// 获取或设置一个值表示与Object相关的hex编码的128位MD5摘要。 /// public string ContentMd5 { get { return _metadata.ContainsKey(HttpHeaders.ContentMd5) ? _metadata[HttpHeaders.ContentMd5] as string : null; } set { if (value != null) { _metadata[HttpHeaders.ContentMd5] = value; } } } /// /// 获取和设置服务器端加密算法 /// public string ServerSideEncryption { get { return _metadata.ContainsKey(HttpHeaders.ServerSideEncryption) ? _metadata[HttpHeaders.ServerSideEncryption] as string : null; } set { if (Aes256ServerSideEncryption != value) throw new ArgumentException("Unsupported server side encryption"); _metadata[HttpHeaders.ServerSideEncryption] = value; } } /// /// 获取文件类型[Normal/Appendable] /// public string ObjectType { get { return _metadata.ContainsKey(HttpHeaders.ObjectType) ? _metadata[HttpHeaders.ObjectType] as string : null; } } /// /// 初始化一个新的实例。 /// public ObjectMetadata() { ContentLength = -1L; } /// /// 增加HTTP header信息 /// /// header元素的名称 /// header元素的值 public void AddHeader(string key, object value) { _metadata.Add(key, value); } /// /// Populates the request header dictionary with the metdata and user metadata. /// /// internal void Populate(IDictionary requestHeaders) { foreach(var entry in _metadata) requestHeaders.Add(entry.Key, entry.Value.ToString()); if (!requestHeaders.ContainsKey(HttpHeaders.ContentType)) requestHeaders.Add(HttpHeaders.ContentType, HttpUtils.DefaultContentType); foreach(var entry in _userMetadata) requestHeaders.Add(OssHeaders.OssUserMetaPrefix + entry.Key, entry.Value); } } }