全部产品
阿里云办公

管理文件

更新时间:2018-07-25 10:37:13

管理文件(Object)

一个Bucket下可能有非常多的文件,SDK提供一系列的接口方便用户管理文件。

查看所有文件

通过Bucket#list_objects来列出当前Bucket下的所有文件。主要的参数如下:

  • :prefix 指定只列出符合特定前缀的文件
  • :marker 指定只列出文件名大于marker之后的文件
  • :delimiter 用于获取文件的公共前缀
  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. # 列出所有文件
  7. objects = bucket.list_objects
  8. objects.each { |o| puts o.key }
  9. # 列出前缀为'my-'的所有文件
  10. objects = bucket.list_objects(:prefix => 'my-')
  11. objects.each { |o| puts o.key }
  12. # 列出前缀为'my-'且在'my-object'之后的所有文件
  13. objects = bucket.list_objects(:prefix => 'my-', :marker => 'my-object')
  14. objects.each { |o| puts o.key }

模拟目录结构

OSS是基于对象的存储服务,没有目录的概念。存储在一个Bucket中所有文件都是通过文件的key唯一标识,并没有层级的结构。这种结构可以让OSS的存储非常高效,但是用户管理文件时希望能够像传统的文件系统一样把文件分门别类放到不同的“目录”下面。通过OSS提供的“公共前缀”的功能,也可以很方便地模拟目录结构。公共前缀的概念请参考查看对象列表

假设Bucket中已有如下文件:

  1. foo/x
  2. foo/y
  3. foo/bar/a
  4. foo/bar/b
  5. foo/hello/C/1
  6. foo/hello/C/2
  7. ...
  8. foo/hello/C/9999

接下来我们实现一个函数叫list_dir,列出指定目录下的文件和子目录:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. def list_dir(dir)
  7. objects = bucket.list_objects(:prefix => dir, :delimiter => '/')
  8. objects.each do |obj|
  9. if obj.is_a?(OSS::Object) # object
  10. puts "Object: #{obj.key}"
  11. else # common prefix
  12. puts "SubDir: #{obj}"
  13. end
  14. end
  15. end

运行结果如下:

  1. > list_dir('foo/')
  2. => SubDir: foo/bar/
  3. SubDir: foo/hello/
  4. Object: foo/x
  5. Object: foo/y
  6. > list_dir('foo/bar/')
  7. => Object: foo/bar/a
  8. Object: foo/bar/b
  9. > list_dir('foo/hello/C/')
  10. => Object: foo/hello/C/1
  11. Object: foo/hello/C/2
  12. ...
  13. Object: foo/hello/C/9999

文件元信息

向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。这些信息在上传时与文件一起存储,在下载时与文件一起返回。

在SDK中文件元信息用一个Hash表示,其他key和value都是String类型,并且都只能是简单的ASCII可见字符。 所有元信息的总大小不能超过8KB。

使用Bucket#put_objectBucket#append_objectBucket#resumable_upload时都可以通过指定:metas参数来指定文件的元信息:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.put_object(
  7. 'my-object-1',
  8. :file => 'local-file',
  9. :metas => {'year' => '2016', 'people' => 'mary'})
  10. bucket.append_object(
  11. 'my-object-2', 0,
  12. :file => 'local-file',
  13. :metas => {'year' => '2016', 'people' => 'mary'})
  14. bucket.resumable_upload(
  15. 'my-object',
  16. 'local-file',
  17. :metas => {'year' => '2016', 'people' => 'mary'})

通过Bucket#update_object_metas命令来更新文件元信息:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.update_object_metas('my-object', {'year' => '2017'})

拷贝文件

使用Bucket#copy_object拷贝一个文件。拷贝时对文件元信息的处理有两种选择,通过:meta_directive参数指定:

  • 与源文件相同,即拷贝源文件的元信息
  • 使用新的元信息覆盖源文件的信息
  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. # 拷贝文件元信息
  7. bucket.copy_object(
  8. 'my-object', 'copy-object',
  9. :meta_directive => Aliyun::OSS::MetaDirective::COPY)
  10. # 覆盖文件元信息
  11. bucket.copy_object(
  12. 'my-object', 'copy-object',
  13. :metas => {'year' => '2017'},
  14. :meta_directive => Aliyun::OSS::MetaDirective::REPLACE)

删除文件

通过Bucket#delete_object来删除某个文件:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. bucket.delete_object('my-object')

批量删除文件

通过Bucket#batch_delete_object批量删除文件,用户可以通过:quiet参数来指定是否返回删除的结果:

  1. require 'aliyun/oss'
  2. client = Aliyun::OSS::Client.new(
  3. endpoint: 'endpoint',
  4. access_key_id: 'AccessKeyId', access_key_secret: 'AccessKeySecret')
  5. bucket = client.get_bucket('my-bucket')
  6. objs = ['my-object-1', 'my-object-2']
  7. result = bucket.batch_delete_object(objs)
  8. puts result #['my-object-1', 'my-object-2'],默认返回删除成功的文件
  9. objs = ['my-object-3', 'my-object-4']
  10. result = bucket.batch_delete_object(objs, :quiet => true)
  11. puts result #[],不返回删除的结果
本文导读目录