/* * Copyright (C) Alibaba Cloud Computing * All rights reserved. * * 版权所有 (C)阿里云计算有限公司 */ using System; using System.Collections.Generic; using System.Globalization; using System.Text; using Aliyun.OSS.Util; namespace Aliyun.OSS { /// /// 指定从OSS下载Object的请求参数。 /// public class GetObjectRequest { private readonly IList _matchingETagConstraints = new List(); private readonly IList _nonmatchingEtagConstraints = new List(); private readonly ResponseHeaderOverrides _responseHeaders = new ResponseHeaderOverrides(); /// /// 获取或设置的名称。 /// public string BucketName { get; private set; } /// /// 获取或设置要下载的Key。 /// public string Key { get; private set; } /// /// 获取表示请求应当返回内容的字节范围。 /// /// /// 调用方法进行设置,如果没有设置,则返回null。 /// public long[] Range { get; private set; } /// /// 获取或设置“If-Unmodified-Since”参数。 /// /// /// 该参数表示:如果传入参数中的时间等于或者晚于文件实际修改时间,则传送文件; /// 如果早于实际修改时间,则返回错误。 /// public DateTime? UnmodifiedSinceConstraint { get; set; } /// /// 获取或设置“If-Modified-Since”参数。 /// /// /// 该参数表示:如果指定的时间早于实际修改时间,则正常传送文件,并返回 200 OK; /// 如果参数中的时间和实际修改时间一样或者更晚,会返回错误。 /// public DateTime? ModifiedSinceConstraint { get; set; } /// /// 获取一个列表表示:如果传入期望的ETag和的ETag匹配,则正常的发送文件。 /// 如果不符合,返回错误。 /// 对应“If-Match”参数, /// public IList MatchingETagConstraints { get { return _matchingETagConstraints; } } /// /// 获取一个列表表示:如果传入期望的ETag和的ETag不匹配,则正常的发送文件。 /// 如果符合,返回错误。 /// 对应“If-None-Match”参数, /// public IList NonmatchingETagConstraints { get { return _nonmatchingEtagConstraints; } } /// /// 获取的返回请求头重载实例。 /// public ResponseHeaderOverrides ResponseHeaders { get { return _responseHeaders; } } /// /// 构造一个新的实例。 /// /// 所在的名称。 /// 。 public GetObjectRequest(string bucketName, string key) { BucketName = bucketName; Key = key; } /// /// 设置一个值表示请求应当返回Object内容的字节范围(可选)。 /// /// /// 范围的起始值。 /// /// 当值大于或等于0时,表示起始的字节位置。 /// 当值为-1时,表示不设置起始的字节位置,此时end参数不能-1, /// 例如end为100,Range请求头的值为bytes=-100,表示获取最后100个字节。 /// /// /// /// 范围的结束值,应当小于内容的字节数。(最大为内容的字节数-1) /// /// 当值小于或等于0时,表示结束的字节位或最后的字节数。 /// 当值为-1时,表示不设置结束的字节位置,此时start参数不能为-1, /// 例如start为99,Range请求头的值为bytes=99-,表示获取第100个字节及 /// 以后的所有内容。 /// /// public void SetRange(long start, long end) { Range = new[] { start, end }; } /// /// 添加Header值 /// /// 添加完Header之后的最终Header internal void Populate(IDictionary headers) { if (Range != null && (Range[0] >= 0 || Range[1] >= 0)) { var rangeHeaderValue = new StringBuilder(); rangeHeaderValue.Append("bytes="); if (Range[0] >= 0) rangeHeaderValue.Append(Range[0].ToString(CultureInfo.InvariantCulture)); rangeHeaderValue.Append("-"); if (Range[1] >= 0) rangeHeaderValue.Append(Range[1].ToString(CultureInfo.InvariantCulture)); headers.Add(HttpHeaders.Range, rangeHeaderValue.ToString()); } if (ModifiedSinceConstraint != null) { headers.Add(OssHeaders.GetObjectIfModifiedSince, DateUtils.FormatRfc822Date(ModifiedSinceConstraint.Value)); } if (UnmodifiedSinceConstraint != null) { headers.Add(OssHeaders.GetObjectIfUnmodifiedSince, DateUtils.FormatRfc822Date(UnmodifiedSinceConstraint.Value)); } if (_matchingETagConstraints.Count > 0) { headers.Add(OssHeaders.GetObjectIfMatch, OssUtils.JoinETag(_matchingETagConstraints)); } if (_nonmatchingEtagConstraints.Count > 0) { headers.Add(OssHeaders.GetObjectIfNoneMatch, OssUtils.JoinETag(_nonmatchingEtagConstraints)); } } } }