使用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的主要内容,如果未能解决你的问题,请参考以下文章