全部产品
对象存储 OSS

快速入门

更新时间:2017-06-07 13:26:11   分享:   

在这一章里,我们将学到如何用OSS .NET SDK完成一些基本的操作。

Step-1.初始化一个OssClient

SDK的OSS操作通过OssClient类完成的,下面代码创建一个OssClient对象:

using Aliyun.OSS;

/// <summary>
/// 由用户指定的OSS访问地址、阿里云颁发的AccessKeyId/AccessKeySecret构造一个新的OssClient实例。
/// </summary>
/// <param name="endpoint">OSS的访问地址。</param>
/// <param name="accessKeyId">OSS的访问ID。</param>
/// <param name="accessKeySecret">OSS的访问密钥。</param>
public void CreateClient(string endpoint, string accessKeyId, string accessKeySecret)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
}

提示:

  • 在上面代码中,变量 accessKeyId 与 accessKeySecret 是由系统分配给用户的,用于标识用户,可能属于您的阿里云账号或者RAM账号 。
  • 关于OssClient的详细介绍,参见 初始化

Step-2. 新建存储空间

存储空间(Bucket)是OSS全局命名空间,相当于数据的容器,可以存储若干文件。您可以按照下面的代码新建一个存储空间:

using Aliyun.OSS;

/// <summary>
/// 在OSS中创建一个新的存储空间。
/// </summary>
/// <param name="bucketName">要创建的存储空间的名称</param>
public void CreateBucket(string bucketName)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    try
    {
        var bucket = client.CreateBucket(bucketName);

        Console.WriteLine("Create bucket succeeded.");

        Console.WriteLine("Name:{0}", bucket.Name);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Create bucket failed, {0}", ex.Message);
    }
}

提示:

  • 关于存储空间的命名规范,参见管理Bucket中的命名规范。

Step-3. 上传文件

文件(Object)是OSS中最基本的数据单元,用下面代码可以实现上传文件:

using Aliyun.OSS;

/// <summary>
/// 上传指定的文件到指定的OSS的存储空间
/// </summary>
/// <param name="bucketName">指定的存储空间名称</param>
/// <param name="key">文件的在OSS上保存的名称</param>
/// <param name="fileToUpload">指定上传文件的本地路径</param>
public void PutObject(string bucketName, string key, string fileToUpload)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

    try
    {
        var result = client.PutObject(bucketName, key, fileToUpload);

        Console.WriteLine("Put object succeeded");
        Console.WriteLine("ETag:{0}", result.ETag);
    }
    catch (Exception es)
    {
        Console.WriteLine("Put object failed, {0}", ex.Message);
    }
}

注意:

  • 每个上传的文件,都可以指定和此文件关联的ObjectMeta。
  • ObjectMeta是用户对该文件的描述,由一系列key-value对组成;
  • 为了保证上传文件服务器端与本地一致,用户可以设置Content-MD5,OSS会计算上传数据 的MD5值并与用户上传的MD5值比较,如果不一致返回InvalidDigest错误码。
  • 计算出来的Content-MD5需要在上传时设置给ObjectMetadata的ETag。
  • 关于文件的命名规范和其他更详细的信息,参见上传文件

Step-4. 列出所有文件

当您完成一系列上传后,可能需要查看某个存储空间中有哪些文件,可以通过下面的程序实现:

using Aliyun.OSS;

/// <summary>
/// 列出指定存储空间的文件列表
/// </summary>
/// <param name="bucketName">存储空间的名称</param>
public void ListObjects(string bucketName) 
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

    try
    {
        var listObjectsRequest = new ListObjectsRequest(bucketName);
        var result = client.ListObjects(listObjectsRequest);

        Console.WriteLine("List object succeeded");
        foreach (var summary in result.ObjectSummaries)
        {
            Console.WriteLine(summary.Key);
        }
    }
    catch (Exception es)
    {
        Console.WriteLine("List object failed, {0}", ex.Message);
    }
}

Step-5. 获取指定文件

您可以参考下面的代码简单地实现一个文件的获取:

using Aliyun.OSS;

var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

/// <summary>
/// 从指定的OSS存储空间中获取指定的文件
/// </summary>
/// <param name="bucketName">要获取的文件所在的存储空间名称</param>
/// <param name="key">要获取的文件在OSS上的名称</param>
/// <param name="fileToDownload">本地存储下载文件的目录<param>
public void GetObject(string bucketName, string key, string fileToDownload)
{
    try
    {
        var object = client.GetObject(bucketName, key);

        //将从OSS读取到的文件写到本地
        using (var requestStream = object.Content)
        {
            byte[] buf = new byte[1024];
            using (var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
            {
                var len = 0;
                while ((len = requestStream.Read(buf, 0, 1024)) != 0)
                {
                    fs.Write(buf, 0, len);
                }
            }
        }
    }
    catch (Exception es)
    {
        Console.WriteLine("Get object failed, {0}", ex.Message);
    }
}

提示:

  • 当调用OssClient的GetObject方法时,会返回一个OssObject的对象,此对象包含了文件的各种信息。
  • 通过OssObject的GetObjectContent方法,可以获取返回的文件的输入流,通过读取此输入流获取此文件的内容,在用完之后关闭这个流。

Step-6. 删除指定文件

您可以参考下面的代码实现一个文件的删除:

using Aliyun.OSS;

/// <summary>
/// 删除指定的文件
/// </summary>   
/// <param name="bucketName">文件所在存储空间的名称</param>
/// <param name="key">待删除的文件名称</param>
public void DeleteObject(string bucketName, string key)
{
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    try
    {
        client.DeleteObject(bucketName, key);
        Console.WriteLine("Delete object succeeded");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Delete object failed, {0}", ex.Message);
    }
}

示例程序

下面是一个完整的程序,演示了创建存储空间,设置存储空间ACL,查询存储空间的ACL,上传文件,下载文件,查询文件列表,删除文件,删除存储空间等操作。

using System;
using System.Collections.Generic;
using Aliyun.OSS;

namespace TaoYe
{
    /// <summary>
    /// 快速入门示例程序 
    /// </summary>
    public static class SimpleSamples
    {
        private const string _accessKeyId = "<your AccessKeyId>";
        private const string _accessKeySecret = "<your AccessKeySecret>";
        private const string _endpoint = "<valid host name>";

        private const string _bucketName = "<your bucket name>";
        private const string _key = "<your key>";
        private const string _fileToUpload = "<your local file path>";

        private static OssClient _client = new OssClient(_endpoint, _accessKeyId, _accessKeySecret);

        public static void Main(string[] args)
        {
            CreateBucket();
            SetBucketAcl();
            GetBucketAcl();

            PutObject();
            ListObjects();
            GetObject();
            DeleteObject();

            // DeleteBucket();

            Console.WriteLine("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

        /// <summary>
        /// 创建一个新的存储空间
        /// </summary>
        private static void CreateBucket()
        {
            try
            {
                var result = _client.CreateBucket(_bucketName);
                Console.WriteLine("创建存储空间{0}成功", result.Name);
            }
            catch (Exception ex)
            {
                Console.WriteLine("创建存储空间失败. 原因:{0}", ex.Message);
            }
        }

        /// <summary>
        /// 上传一个新文件
        /// </summary>
        private static void PutObject()
        {
            try
            {
                _client.PutObject(_bucketName, _key, _fileToUpload);
                Console.WriteLine("上传文件成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("上传文件失败.原因: {0}", ex.Message);
            }
        }

        /// <summary>
        /// 列出存储空间内的所有文件
        /// </summary>
        private static void ListObjects()
        {
            try
            {
                var keys = new List<string>();
                ObjectListing result = null;
                string nextMarker = string.Empty;

                /// 由于ListObjects每次最多返回100个结果,所以,这里需要循环去获取,直到返回结果中IsTruncated为false
                do
                {
                    var listObjectsRequest = new ListObjectsRequest(_bucketName)
                    {
                        Marker = nextMarker,
                        MaxKeys = 100
                    };
                    result = _client.ListObjects(listObjectsRequest);

                    foreach (var summary in result.ObjectSummaries)
                    {
                        keys.Add(summary.Key);
                    }

                    nextMarker = result.NextMarker;
                } while (result.IsTruncated);

                Console.WriteLine("列出存储空间中的文件");
                foreach (var key in keys)
                {
                    Console.WriteLine("文件名称:{0}", key);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("列出存储空间中的文件失败.原因: {0}", ex.Message);
            }

        }

        /// <summary>
        /// 下载文件
        /// </summary>
        private static void GetObject()
        {
            try
            {
                var result = _client.GetObject(_bucketName, _key);
                Console.WriteLine("下载的文件成功,名称是:{0},长度:{1}", result.Key, result.Metadata.ContentLength);
            }
            catch (Exception ex)
            {
                Console.WriteLine("下载文件失败.原因:{0}", ex.Message);
            }
        }

        /// <summary>
        /// 删除文件
        /// </summary>
        private static void DeleteObject()
        {
            try
            {
                _client.DeleteObject(_bucketName, _key);
                Console.WriteLine("删除文件成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("删除文件失败.原因: {0}", ex.Message);
            }
        }

        /// <summary>
        /// 获取存储空间ACL的值
        /// </summary>
        private static void GetBucketAcl()
        {
            try
            {
                var result = _client.GetBucketAcl(_bucketName);

                foreach (var grant in result.Grants)
                {
                    Console.WriteLine("获取存储空间权限成功,当前权限:{0}", grant.Permission.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取存储空间权限失败.原因: {0}", ex.Message);
            }
        }

        /// <summary>
        /// 设置存储空间ACL的值
        /// </summary>
        private static void SetBucketAcl()
        {
            try
            {
                _client.SetBucketAcl(_bucketName, CannedAccessControlList.PublicRead);
                Console.WriteLine("设置存储空间权限成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("设置存储空间权限失败. 原因:{0}", ex.Message);
            }
        }

        /// <summary>
        /// 删除存储空间
        /// </summary>
        private static void DeleteBucket()
        {
            try
            {
                _client.DeleteBucket(_bucketName);
                Console.WriteLine("删除存储空间成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("删除存储空间失败", ex.Message);
            }
        }
    }
}
本文导读目录
本文导读目录
以上内容是否对您有帮助?