使用boto3批量上传图片到S3

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用boto3批量上传图片到S3相关的知识,希望对你有一定的参考价值。

参考技术A 最近在工作中需要把本地的图片上传到亚马逊对象存储S3中供外链访问。

为了更快的实现,使用了Python 接口的boto3进行封装,实现批量上传图片到S3

主要有以下的几个函数:

1、实现S3的连接

2、实现单个图片的上传

3、实现单个图片的删除

4、实现整个bucket的内容的清除

5、实现上传整个文件夹里的图片并做去除非文件

批量上传图片到 s-s-rS

【中文标题】批量上传图片到 s-s-rS【英文标题】:Bulk uploading images to s-s-rS 【发布时间】:2012-06-01 17:21:10 【问题描述】:

我们使用出色的RSBuild 将报告批量上传到 SQL Server Reporting Services (s-s-rS),但我找不到批量上传图像的方法。使用报告管理器一次上传一张图像是愚蠢的。困难在于 RSBuild 使用的 SQL Server Reporting Web 服务不支持图像上传。有没有办法以其他方式将图像批量上传到 s-s-rS?

【问题讨论】:

您是在使用 RSBuild 来发布报告吗?还是您将其用于其他用途?我之所以问,是因为我们在较低环境中有许多服务器,我们需要定期部署报告并保持同步。你会推荐在这种情况下使用 RSBuild 吗? @VoodooChild 我们使用 RSBuild 仅用于发布报告。您可以通过构建服务器上的 RSBuild 自动部署。使用 TFS,我想它会是直截了当的。为这个“常规基础”制作一个带有时间表的构建过程模板。制作您自己的 CustomProcess 程序集,使用工作流项执行 RSBuild,然后通过自定义程序集上传您的图像。此外,您可以调用与 RSBuild 相同的 Web 服务。 【参考方案1】:

您需要先手动上传一张图片,以便读取目录表中插入 ReportServer 数据库的图片行的内容,并在以下脚本中使用 ParentId、PolicyId 和 CreatedById 和 ModifiedById。

当然,这可以进一步抽象成一个应用程序,更棒。

BEGIN TRAN
    DECLARE @ReportFolderPath NVARCHAR(MAX)
    DECLARE @ImageFolderPath NVARCHAR(MAX)
    DECLARE @ImageFileName NVARCHAR(MAX)
    DECLARE @ImageFullFileName NVARCHAR(MAX)
    DECLARE @ImageFileExtension NVARCHAR(MAX)
    DECLARE @ImageMime NVARCHAR(MAX)
    DECLARE @ImageFullPath NVARCHAR(MAX)
    DECLARE @ParentId NVARCHAR(MAX)
    DECLARE @PolicyId NVARCHAR(MAX)
    DECLARE @CreatedModifiedId NVARCHAR(MAX)
    DECLARE @SqlToGetImageContent NVARCHAR(MAX)
    DECLARE @ImageContent VARBINARY(MAX)

    SET @ReportFolderPath = '/MyReports/'
    SET @ImageFolderPath = 'C:\Users\jdoe\Desktop\Reports\images\'
    SET @ImageFileName = 'logo'
    SET @ImageFileExtension = 'bmp' 
    SET @ImageFullFileName = @ImageFileName + '.' + @ImageFileExtension
    SET @ImageFullPath = @ImageFolderPath + @ImageFileName  
    SET @ParentId = '0AAFF0D8-0616-4E63-9B1D-EBF99153B443'      
    SET @PolicyId = '8632B07A-EE75-4097-970C-18BE9958F7A2'                                                          
    SET @CreatedModifiedId = 'C6121121-D0E4-4B25-BD4E-177EDA709ECB'
    SET @SqlToGetImageContent = 'SELECT @ImageContent = BulkColumn FROM Openrowset(Bulk '''+ @ImageFolderPath + @ImageFullFileName +''', Single_Blob) AS ImageData'

    IF(@ImageFileExtension = 'jpg')
        BEGIN
            SET @ImageMime = 'image/jpeg'
        END
    ELSE
        BEGIN
            SET @ImageMime = 'image/' + @ImageFileExtension
        END


    EXEC SP_EXECUTESQL 
        @Query  = @SqlToGetImageContent
      , @Params = N'@ImageContent VARBINARY(MAX) OUTPUT'
      , @ImageContent = @ImageContent OUTPUT

    INSERT INTO [ReportServer$DEV2012].[dbo].[Catalog] (ItemID, [Path], Name, ParentID, [Type], Content, [Intermediate], SnapshotDataID,    LinkSourceID,   Property,   [Description],  Hidden, CreatedByID,    CreationDate,   ModifiedByID,   ModifiedDate,   MimeType,   SnapshotLimit,  Parameter,  PolicyID, PolicyRoot, ExecutionFlag, ExecutionTime, SubType, ComponentID)
    VALUES(
            NEWID(),
            @ReportFolderPath + @ImageFullFileName, 
            @ImageFullFileName, 
            @ParentId,  
            3,  
            (SELECT @ImageContent),
            NULL,   
            NULL,   
            NULL,   
            '<Properties />',   
            NULL,   
            0,  
            @CreatedModifiedId, 
            GETDATE(),  
            @CreatedModifiedId,
            GETDATE(),  
            @ImageMime, 
            NULL,   
            NULL,   
            @PolicyId,  
            0,  
            1,  
            NULL,   
            NULL,   
            NULL
        )
COMMIT TRAN

【讨论】:

【参考方案2】:

为了在 s-s-rS 解决方案中加载多个图像,我使用了以下方法。这很容易 首先,在报表管理器中创建一个新的图像文件夹,您要在其中链接报表中的外部图像

    打开 Visual Studio 导航到文件 选择打开 选择文件 创建一个名为“Images”或其他名称的新文件夹 将所需的所有图像粘贴到此文件夹中 现在,导航到解决方案资源管理器 选择“报告”并右键单击 选择添加,然后选择“现有项目” 导航到刚刚创建的新文件夹 将底部的文件类型更改为“所有文件” 选择所有需要的图像。全选快捷键是Ctrl键加字母A 点击“添加” 所有图片都将添加到解决方案资源管理器中的任何报告下方

    导航到“调试”菜单并选择解决方案属性,如此处所示 Solution Properties

    临时更改 TargetReportFolder 以匹配您在报告管理器中创建的新图像文件夹的名称

    在解决方案资源管理器中,右键单击所有图像(不是报告) 选择“部署”

然后在 Visual Studio 中验证部署是否成功,导航到 Report Manager 文件夹并验证图像是否存在!

不要忘记:将 TargetReportFolder 重置为之前的值!

Report Manager Image Folder

【讨论】:

以上是关于使用boto3批量上传图片到S3的主要内容,如果未能解决你的问题,请参考以下文章

node批量读取本地图片并上传

使用ivx实现批量上传图片的经验总结

面试:ios 批量上传图片

安卓批量上传图片到七牛的两种方法

kindeditor批量上传,怎么更改一次性上传图片的数量和图片大小限制呢?

小程序之批量上传图片