zoukankan      html  css  js  c++  java
  • 阿里云存储OSS之九大使用技巧

    http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9%9D%E5%A4%A7%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/

    阿里云内部人员撰写的阿里云存储OSS使用教程,对使用OSS的同学们很有帮助!

    阿里云存储OSS使用技巧之一:在OSS上读写文件


    从你的代码中,把fopen()、fclose()这类的函数删掉吧!取而代之的是RESTful风格的HTTP请求:写文件是PUT;读文件是GET;获取文件属性是HEAD;删除文件是DELETE。
    在搭建好的OSS Python开发环境下,直接用上步声明的my_store对象创建并写入一个新文件(OSS称之为Object)的代码如下:

    res =  my_store.put_object(bucket_name, object_name, input_content,  content_type)

    上例中,content_type可以根据需求,填入HTTP协议中规定的某一种文件类型。如JPG图片使用“image/jpeg”,MP3文件 使用“audio/mpeg”,具体定义请参考RFC 2616。选择正确的content-type,可以让其他互联网应用直接正确地使用OSS上的文件。

    读取一个已存在文件的代码如下:

    res =  my_store.get_object (bucket_name, object_name)

    获取文件属性的代码如下:

    res =  my_store.head_object (bucket_name, object_name)

    删除一个文件的代码如下:

    res =  my_store.delete_object (bucket_name, object_name)

    通过上面列举的这四个简单的函数,你就可以轻松地将建立在传统文件系统上的应用移植到OSS这个云存储平台上来了。

    阿里云存储OSS使用技巧之二:通过签名URL防盗链

    由于OSS有着非常优秀的网络带宽质量,很多朋友希望基于OSS开发图片、音乐、视频等网站和应用。但如何有效地防盗链是个让人头疼的问题。这里介绍一个简单且安全的方法:通过签名URL防盗链。
    首先,确认自己的bucket权限是private,即这个bucket的所有请求必须在签名认证通过后才被认为是合法的。然后根据操作类型、要访问的 bucket、要访问的object以及超时时间,动态地生成一个经过签名的URL。通过这个签名URL,你授权的用户就可以在该签名URL过期时间前执 行相应的操作。

    签名的python代码如下:

    url = my_store.sign_url (method, bucket_name, object_name,timeout = 60)

    其中method可以是PUT,GET,HEAD,DELETE中的任意一种;最后一个参数“timeout”是超时的时间,单位是秒。一个通过上面python方法,计算得到的签名URL为:

    http://storage.aliyun.com/sharedata/lingyun.jpg?OSSAccessKeyId=y6h7nbcothehv
    cp7jlnwmrw9&Expires=1335084740&Signature=LZeqnHSo5WkDNWKffKDgQBXR6fY=

    通过这种动态计算签名URL的方法,可以有效地保护放在OSS上的数据,防止被其他人盗链。

    阿里云存储OSS使用技巧之三:满足特定条件时才传输数据

    IMS(If-Modified-Since)参数是HTTP协议中,经常被用到的一个参数。它的含义是:通过这个时间戳参数,服务器端可以判断客 户端的数据是否是最新的;如果不是最新的,则返回服务器端的数据;如果是最新的,则返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载数据了。这样在网络上传输的数据量就会大大减少,同时也减轻了服务器的负担。
    包括IMS在内,OSS共支持四种条件传输参数。只有Object的属性满足客户端给出的条件时,OSS才传输Object的数据。这四个参数是:
    l If-Modified-Since
    l If-Unmodified-Since
    l If-Match
    l If-None-Match

    If-Unmodified-Since的含义和If-Modified-Since正好相反:如果内容没更新,则返回数据;否则返回HTTP状态 码304。If-Unmodified-Since和If-Modified-Since这两个参数可以一起使用,以指定一个时间窗口。例如:

    headers  = {}  
    headers[‘“If-Modified-Since’] = Sun, 22 Apr 2012 09:06:23 GMT  
    headers[‘“If-Unmodified-Since’] = Sun, 22 Apr 2012 09:16:23 GMT  
    res =  my_store.get_object (bucket_name, object_name, headers)

    If-Match、If-None-Match这对参数与If-Unmodified-Since、If-Modified-Since参数的含义 类似,只是参数不是时间戳,而是内容的MD5值。利用好这四个参数,可以节省大量的流量,也就是可以节省很多money。

    阿里云存储OSS使用技巧之四:OSS上如何实现文件夹功能

    许多终端用户习惯了文件夹这个概念,而较难适应只有bucket和object的云存储逻辑。但我们可以基于OSS从逻辑上实现文件夹功能。

    首先,我们可以按照惯例,认为所有以“/”[1]结尾的Object都是一个文件夹。例如,用户认为:“folder”是一个文件;“folder /”是一个文件夹;而“folder/file.txt”是一个放在folder文件夹内名为file.txt的文件。在云存储OSS上,“folder /”、“folder”和“folder/file.txt”其实都是object。
    当用户需要查询一个文件夹下的文件时,我们就需要巧妙地通过List Object(Get Bucket)接口的四个参数:prefix,marker,delimiter和max-keys来实现。

    例如,我们在OSS上名为”mydata”的bucket内有如下几个文件:

    lingyun.doc  
    folder/  
    folder/file1.txt  
    folder/file2.txt  
    folder/file3.txt  
    folder/image/  
    folder/image/test.jpg

    如果认为这个bucket是一个传统文件系统的话,当用户进入该bucket,应该只看到一个名为“lingyun.doc”的文件和一个名为 “folder/”的文件夹。为了获得这样的效果,我们将List Object请求的delimiter参数设为“/”即可,代码如下:

    res =  my_store.list_objects("mydata", delimiter='/')

    OSS收到这个请求后,会返回一个XML格式的消息,中间记录了这个bucket内有一个key为“lingyun.doc”的文件,以及一个名为 “folder”的common prefix,分别对应于文件和文件夹。当继续想查看文件夹”folder”内的文件列表时,可以将prefix参数设为“folder/”,代码如下:

    res =  my_store.list_objects("mydata", prefix=’folder/’, delimiter='/')

    执行后,我们就可以知道文件夹“folder”内,有三个文件:“file1.txt”,“file2.txt”,“file3.txt”和一个子文件夹:“image/”。
    list objects命令的另一个参数是max-keys,它定义了在一次请求内OSS返回文件和文件夹最大的数目,默认值是100,最大可以设成1000。但 如果一个文件夹内有超过1000个文件怎么办?这时,可以利用list objects的最后一个参数——marker。这个参数告诉OSS从指定的文件开始,按照字典序
    查其后面的文件。示例代码为:

    res =  my_store.list_objects("mydata", prefix='folder/',  marker='folder/file1.txt', 
    delimiter='/', maxkeys='1')

    这时,OSS只会返回一个查询结果:“folder/file2.txt”。利用好这四个参数,你会发现做个类似于DropBox[2]的应用是如此的简单。

    阿里云OSS使用技巧之五:实现Object断点下载和并发下载

    从互联网上下载数据时,支持断点下载是一项非常基本的功能。其原理很简单,就是记住上次接受数据的位置,然后要求服务器从上次断点的地方开始将余下 的部分传输过来。下载OSS上的Object时,可以采用HTTP请求中通用的Range这一header,来完成这个功能。例如:
    获取一个文件的头5个字节的请求代码如下:

    Headers = {}  
    headers['range'] = "bytes=0-4"  
    res = my_store.get_object (bucket_name, object_name,  headers)

    获取一个文件中间3KB字节数据的请求代码如下:

    Headers = {}  
    headers['range'] = "bytes=1024-4095"  
    res = my_store.get_object (bucket_name, object_name,  headers)

    知道了如何使用range来随机读一个object后,实现并发下载就轻而易举了。只要将要下载的object分成若干份,然后开多个线程,每个线程下载其中的一块。在所有块都下载完成后,整个文件就下载完成了。
    注意:按照HTTP协议,如果用户的请求中含有range字段,则服务器返回的HTTP状态码为206 (Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它)。

    阿里云存储OSS使用技巧之六:实现大文件并发上传

    由于OSS是一个互联网服务,用户终端很难长时间保证和OSS之间的TCP连接。所以在上传一个大文件时会经常发生请求链接被断开的情况。

    这时候就可以采用OSS的multipart Upload模式。

    Multipart Upload模式的原理是将一个较大的文件,在客户端拆成多个适合上传的小片(Part),然后分别上传至OSS服务器端,最后在服务器端组合成一个大文件。由于每个小片是独立上传的,它们之间没有任何的关联,所以利用这种模式就可以做到并发上传。

    虽然原理看起来很麻烦,但是如果使用OSS提供的SDK的话,只要一行命令就搞定了并发上传:

    res = my_store.multi_upload_file(bucket_name, object_name,thread_num = 10)

    具体实现细节请参考OSS API开发文档和SDK内部的实现逻辑,有兴趣的同学可以按照自己特定的需求自己实现一下。

    阿里云OSS使用技巧之七:删除一个有大量Object的bucket

    有一天,也许你只是看着自己的一个bucket不爽,想删除它。但OSS服务出于保护数据的考虑会温柔地通知你:这个bucket里面还有数据,不 能删除它。打开这个bucket一看,成千上万的文件在那里等着你去删。一个一个删,肯定太stupid了。这里教你一个小方法:先获取Object列 表,再使用批量删除接口。在Python的SDK中已经封装好了与之对应的接口:

    object_list = []  
    while true:
              object_list = my_store.list_objects(bucket_name)
              if len(object_list) != 0:
                  my_store.batch_delete_objects(bucket_name, object_list)
              else:
                  break

    这样,删除几万个文件,也就是几十个请求的事情,不但节省了请求次数,更为我们节省了大量的宝贵时间。

    阿里云OSS使用技巧之八:为Object添加自定义的Header

    很多情况下,我们希望对文件的META属性中放入一些自定义的信息数据。例如,一张照片的拍摄时间;一篇文章的作者;一首歌曲的专辑名;甚至是一个专利的专利号。这样,我们在查看文件的META属性时,就可以获取这些自定义的信息数据,而不必将整个文件下载下来。
    在使用OSS时,可以通过在PutObject的时候把自定义的信息数据放在以x-oss-meta-为前缀的参数中。OSS将把这些参数视为用户自定义的meta数据。添加x-oss-meta-author的实现代码为:

    headers  = {}  
    headers[‘“x-oss-meta-author’]  = obama  
    res =  my_store.put_object  (bucket_name, object_name,haders)

    在你获取这个object的时候,你将收到如下的HTTP返回值:

    HTTP/1.1  200 OK   
    x-oss-request-id:  3a89276f-2e2d-7965-3ff9-51c875b99c41   
    Date:  Fri, 24 Feb 2012 06:38:30 GMT   
    Last-Modified:  Fri, 24 Feb 2012 06:07:48 GMT   
    ETag:  "5B3C1A2E053D763E1B002CC607C5A0FE "   
    Content-Type:  image/jpg   
    Content-Length:  344606   
    X-oss-meta-author:obama  
    Server:  AliyunOSS  
    [344606  bytes of object data]

    阿里云OSS使用技巧之九:在OSS上调试自己的代码

    大家在用OSS开发时,如果发送了非法或者不符合规则的HTTP请求,OSS会返回错误码和相应的信息来帮助开发者发现和定位问题。OSS对于所有 HTTP返回码不是2XX的请求,都会返回一个XML结构的消息体,里面详细记录了无法执行用户请求的原因。例如,如果你尝试访问一个你没有访问权限的 object,那么OSS会返回给你403 Forbidden的HTTP错误码,以及一个如下的XML格式的消息体:

    <?xml  version="1.0" ?>  
    <Error>  
            <code data-linenums="true"Code>  
                    AccessDenied  
            </code>  
            <Message>  
                    AccessDenied  
            </Message>  
            <RequestId>  
                     17baec8b-1a0e-8dad-4a6e-343b4d8450dc  
            </RequestId>  
            <HostId>  
                    storage.aliyun.com  
            </HostId>  
    </Error>

    其中上例中的“RequestId”字段是唯一标识该次请求的UUID;当你无法解决问题时,可以凭这个RequestId来请求OSS开发工程师的帮助。

    后记:
    通过上述OSS开发小技巧的介绍,相信大家一定对OSS这个云存储服务有了更深刻的理解。俗话说“高手在民间”,祝大家可以在此基础上开发出类似DropBox、DrawSomething、Instagram等成功应用。

  • 相关阅读:
    AJAX 大全
    has value '1.8', but '1.7' is required
    VS2010官方下载地址
    win10桌面显示我的电脑
    使用 CAST
    for循环+canvas实现黑客帝国矩形阵
    C# Lambda
    win7系统部分便笺的元数据已被损坏怎么恢复
    SQL查询所有表,所有列
    truncate和delete之间有什么区别
  • 原文地址:https://www.cnblogs.com/welhzh/p/6004288.html
Copyright © 2011-2022 走看看