全部产品
Search
文档中心

对象存储 OSS:下载文件

更新时间:Jan 25, 2024

默认情况下,在受版本控制的存储空间(Bucket)中调用GetObject接口仅返回文件(Object)的当前版本。

背景信息

对某个Bucket执行GetObject操作时,分以下三种情况:

  • 如果该Bucket中Object的当前版本是删除标记(Delete Marker),则返回404 Not Found。

  • 如果在查询参数中指定Object的versionId,则返回指定的Object版本。当versionId指定为“null”时,则返回versionId为“null”的Object版本。

  • 通过指定versionId的方式来获取删除标记时,则返回405 Method Not Allowed。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 要下载文件,您必须有oss:GetObject权限。具体操作,请参见为RAM用户授权自定义的权限策略

示例代码

以下代码用于下载文件。

using System;
using System.IO;
using Aliyun.OSS;

namespace Samples
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
            var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
            var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
            var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
            // 填写Bucket名称,例如examplebucket。
            var bucketName = "examplebucket";
            // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
            var objectName = "exampledir/exampleobject.txt";
            // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
            var downloadFilename = "D:\\localpath\\examplefile.txt";
            var versionid = "yourArchiveObjectVersionid";
            // 创建OSSClient实例。
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
            try
            {
                // 下载文件到流。OssObject包含了文件的各种信息,如文件所在的存储空间、文件名、元数据以及一个输入流。
                var request = new GetObjectRequest(bucketName, objectName)
                {
                    // 指定Object的版本ID。
                    VersionId = versionid
                };
                var obj = client.GetObject(request);
                using (var requestStream = obj.Content)
                {
                    byte[] buf = new byte[1024];
                    var fs = File.Open(downloadFilename, FileMode.OpenOrCreate);
                    var len = 0;
                    // 通过输入流将文件的内容读取到文件或者内存中。
                    while ((len = requestStream.Read(buf, 0, 1024)) != 0)
                    {
                        fs.Write(buf, 0, len);
                    }
                    fs.Close();
                }
                Console.WriteLine("Get object succeeded, vesionid:{0}", versionid);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Get object failed. {0}", ex.Message);
            }
        }
    }
}

相关文档

关于下载文件的API接口说明,请参见GetObject