【问题标题】:S3 client partially uploads .png filesS3 客户端部分上传 .png 文件
【发布时间】:2019-07-24 08:59:53
【问题描述】:

我正在开发一个 Python 应用程序,它由一个上传模块组成,核心功能从队列中提取 .png 图像,并使用 Boto3 客户端将它们上传到某个存储桶。

问题在于,有时(并非总是)图像仅上传了一部分。例如当我下载有缺陷的图像时,它似乎被裁剪了。

当我手动上传图像(使用 FTP/SSH 客户端)时,图像被完美上传。

以下是我的核心函数,注意我使用的是upload_fileobj() 和进度条机制的回调。

def upload_file_aws(self):
   s3 = boto3.client('s3', aws_access_key_id=self.aws_access_key,
                              aws_secret_access_key=self.aws_secret_key)
            if (not self.uploader.queue.empty()):
                file = self.uploader.queue.get()
                with open(file, 'rb') as f:
                    aws_format = '%s' % AppObject.file_path_dic.get(file) 
                    s3.upload_fileobj(f, self.bucket_name, aws_format, Callback=ProgressBarInit(file))

以前有人遇到过这个问题吗? 在亚马逊的 doc 文件中,他们声明 boto3 协议不支持部分上传。

【问题讨论】:

    标签: python amazon-web-services amazon-s3 png boto3


    【解决方案1】:

    尺寸大于5 MB 的较大图像很有可能发生这种情况。 您应该使用 multipart upload 作为 large size 对象。

    这是multipart上传的基本代码示例。

    import boto3
    
    def upload_file( filename ):
        session = boto3.Session()
        s3_client = session.client( 's3' )
    
        try:
            print "Uploading file:", filename
    
            tc = boto3.s3.transfer.TransferConfig()
            t = boto3.s3.transfer.S3Transfer( client=s3_client, 
                                             config=tc )
    
            t.upload_file( filename, 'my-bucket-name', 'name-in-s3.dat' )
    
        except Exception as e:
            print "Error uploading: %s" % ( e )
    

    【讨论】:

    • 谢谢!这个方法支持回调吗?
    猜你喜欢
    • 2021-06-30
    • 2017-07-23
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2023-04-09
    • 2018-01-07
    相关资源
    最近更新 更多