示例#1
0
 def initiate_multipart_upload(self, key_name, acl=None, metadata={}, mimetype=None,
         headers={}):
     ''' 初始化分片上传 
     
         return type : dict
             {
                 u'UploadId': u'535dd723761d4f14a7210945cd7dea11', 
                 u'Key': u'test-python.zip', 
                 u'Bucket': u'create-a-bucket'
             }
     '''
     headers = headers.copy()
     if mimetype:
         headers["Content-Type"] = str(mimetype)
     elif "Content-Type" not in headers:
         headers["Content-Type"] = guess_mimetype(key_name)
     headers.update(metadata_headers(metadata))
     if acl: headers["X-AMZ-ACL"] = acl
     headers["Content-Length"] = "0"
     scsreq = self.request(method="POST", key=key_name, headers=headers, subresource='multipart')
     scsResponse = self.send(scsreq)
     initMultipartUploadResult = json.loads(scsResponse.read())
     scsResponse.close()
     multipart = MultipartUpload(self)
     multipart.upload_id = initMultipartUploadResult["UploadId"]
     multipart.bucket_name = initMultipartUploadResult["Bucket"]
     multipart.key_name = initMultipartUploadResult["Key"]
     multipart.init_multipart_response = scsResponse
     return multipart
示例#2
0
 def put_relax(self,key,sina_sha1, s_sina_length, acl=None, 
               metadata={}, mimetype=None,headers={}):
     '''
         上传接口Relax
         REST型PUT上传,但不上传具体的文件内容。而是通过SHA-1值对系统内文件进行复制。
     '''
     if isinstance(sina_sha1, unicode):
         sina_sha1 = sina_sha1.encode(self.default_encoding)
     headers = headers.copy()
     if mimetype:
         headers["Content-Type"] = str(mimetype)
     elif "Content-Type" not in headers:
         headers["Content-Type"] = guess_mimetype(key)
     if sina_sha1 == None:
         raise ValueError("sina_sha1 must not None!!")
     if "s-sina-sha1" not in headers:
         headers["s-sina-sha1"] = sina_sha1
     if s_sina_length == 0:
         raise ValueError("s_sina_length must bigger than 0!!")
     if "s-sina-length" not in headers:
         headers["s-sina-length"] = s_sina_length
     headers.update(metadata_headers(metadata))
     if acl: headers["X-AMZ-ACL"] = acl
     if "Content-Length" not in headers:
         headers["Content-Length"] = 0
     scsreq = self.request(method="PUT", key=key, headers=headers,subresource='relax')
     return self.send(scsreq).close()
示例#3
0
    def put(self, key, data=None, acl=None, metadata={}, mimetype=None,
            transformer=None, headers={},args=None,subresource=None):
        if isinstance(data, unicode):
            data = data.encode(self.default_encoding)
        headers = headers.copy()
        if mimetype:
            headers["Content-Type"] = str(mimetype)
        elif "Content-Type" not in headers:
            headers["Content-Type"] = guess_mimetype(key)
        headers.update(metadata_headers(metadata))
        if acl: headers["X-AMZ-ACL"] = acl
        if transformer: data = transformer(headers, data)
        if "Content-Length" not in headers:
#             if isinstance(data, file)  isinstance(data, FileChunkIO):
            if hasattr(data,'fileno'):
                headers["Content-Length"] = str(getSize(data.name))
            elif hasattr(data,'__len__'):
                headers["Content-Length"] = str(len(data))
            else:
                raise ValueError("Content-Length must be defined!!")
                
#         if "s-sina-sha1" not in headers:
#             headers["s-sina-sha1"] = aws_md5(data)
        scsreq = self.request(method="PUT", key=key, data=data, headers=headers, 
                              args=args, subresource=subresource)
        scsResponse = self.send(scsreq)
        return scsResponse
示例#4
0
 def acl_info(self, key, mimetype=None, headers={}):
     '''
         获取文件的acl信息
     '''
     headers = headers.copy()
     if mimetype:
         headers["Content-Type"] = str(mimetype)
     elif "Content-Type" not in headers:
         headers["Content-Type"] = guess_mimetype(key)
     if "Content-Length" not in headers:
         headers["Content-Length"] = 0
     scsreq = self.request(key=key, args={'formatter':'json'}, headers=headers, subresource='acl')
     scsResponse = self.send(scsreq)
     aclResult = json.loads(scsResponse.read())
     scsResponse.close()
     return aclResult
示例#5
0
 def copy(self, source, key, acl=None, metadata=None,
          mimetype=None, headers={}):
     """
         注意:
         source    必须从bucket开始,如:'/cloud0/aaa.txt'
     """
     headers = headers.copy()
     headers.update({"Content-Type": mimetype or guess_mimetype(key)})
     if "Content-Length" not in headers:
         headers["Content-Length"] = 0
     headers["X-AMZ-Copy-Source"] = source
     if acl: headers["X-AMZ-ACL"] = acl
     if metadata is not None:
         headers["X-AMZ-Metadata-Directive"] = "REPLACE"
         headers.update(metadata_headers(metadata))
     else:
         headers["X-AMZ-Metadata-Directive"] = "COPY"
     return self.send(self.request(method="PUT", key=key, headers=headers)).close()
示例#6
0
 def update_meta(self, key, metadata={}, remove_metadata=[], acl=None, 
                 mimetype=None, headers={}):
     '''
         更新文件meta信息
         删除meta功能暂时不可用
     '''
     headers = headers.copy()
     if mimetype:
         headers["Content-Type"] = str(mimetype)
     elif "Content-Type" not in headers:
         headers["Content-Type"] = guess_mimetype(key)
     headers.update(metadata_headers(metadata))
     headers.update(metadata_remove_headers(remove_metadata))
     if acl: headers["X-AMZ-ACL"] = acl
     if "Content-Length" not in headers:
         headers["Content-Length"] = 0
     scsreq = self.request(method="PUT", key=key, headers=headers, subresource='meta')
     return self.send(scsreq).close()   
示例#7
0
 def complete_multipart_upload(self, multipart):
     
     jsonArray = []
     for part in multipart.parts:
         jsonDict = {}
         jsonDict['PartNumber']=part.part_num
         jsonDict['ETag']=part.etag
         jsonArray.append(jsonDict)
     
     data = json.dumps(jsonArray)
     
     headers = {}
     headers["Content-Type"] = guess_mimetype(multipart.key_name)
     headers["Content-Length"] = str(len(data))
     if "s-sina-sha1" not in headers:
         headers["s-sina-sha1"] = aws_md5(data)
     
     scsreq = self.request(method="POST", data=data, headers=headers, key=multipart.key_name, args={'uploadId':multipart.upload_id})
     scsResponse = self.send(scsreq)
     return scsResponse.close()