如何使用boto上传s3上带名字的批量图像?

时间:2018-05-23 08:29:06

标签: python amazon-web-services boto3

我正在将图片上传到当地的文件夹。喜欢在网站/上传。 在搜索之后我得到了将图像上传到s3我必须这样做

import boto3

s3 = boto3.resource('s3')

# Get list of objects for indexing
images=[('image01.jpeg','Albert Einstein'),
      ('image02.jpeg','Candy'),
      ('image03.jpeg','Armstrong'),
      ('image04.jpeg','Ram'),
      ('image05.jpeg','Peter'),
      ('image06.jpeg','Shashank')
      ]

# Iterate through list to upload objects to S3   
for image in images:
    file = open(image[0],'rb')
    object = s3.Object('rekognition-pictures','index/'+ image[0])
    ret = object.put(Body=file,
                    Metadata={'FullName':image[1]}
                    )

澄清

我的代码是将图像和名称发送给S3。但我不知道如何在这行代码images=[('image01.jpeg','Albert Einstein'),中获取图像,如何在/upload/image01.jpeg中从此代码中获取此图像。以及如何从s3获取图像并在我的网站图像页面中显示?

3 个答案:

答案 0 :(得分:1)

使用资源方法:

# Iterate through list to upload objects to S3
bucket = s3.Bucket('rekognition-pictures')

for image in images:
    bucket.upload_file(Filename='/upload/' + image[0],
                       Key='index/' + image[0],
                       ExtraArgs={'FullName': image[1]}
                      )

使用客户端方法:

import boto3

client = boto3.client('s3')

...

# Iterate through list to upload objects to S3
for image in images:
    client.upload_file(Filename='/upload/' + image[0],
                       Bucket='rekognition-pictures',
                       Key='index/' + image[0],
                       ExtraArgs={'FullName': image[1]}
                      )

答案 1 :(得分:1)

我知道你的问题是boto3特有的,所以你可能不喜欢我的答案,但它会达到你想要达到的效果,而aws-cli也会使用boto3。

见这里:http://bigdatums.net/2016/09/17/copy-local-files-to-s3-aws-cli/

此示例来自网站,可以轻松地在脚本中使用:

#!/bin/bash
#copy all files in my-data-dir into the "data" directory located in my-s3-bucket 
aws s3 cp my-data-dir/ s3://my-s3-bucket/data/ --recursive

答案 2 :(得分:1)

首先,您作为参考显示的代码片段不适用于您的用例,因为我已经编写了从boto3批量上传的代码段,您必须在脚本中提供图像路径以及图像的元数据,所以你的代码片段中的名称是元数据。所以我从你的问题中了解到,你想要上传本地文件夹中的文件,并希望在上传之前提供自定义名称,所以这就是你要做的。

import os
import boto3

s3 = boto3.resource('s3')

directory_in_str="E:\\streethack\\hold"

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
    filename = os.fsdecode(file)
    if filename.endswith(".jpeg") or filename.endswith(".jpg") or filename.endswith(".png"):

        strg=directory_in_str+'\\'+filename
        print(strg)
        print("Enter name for your image : ")
        inp_val = input()

        strg2=inp_val+'.jpeg'
        file = open(strg,'rb')
        object = s3.Object('mausamrest','test/'+ strg2)     #mausamrest is bucket
        object.put(Body=file,ContentType='image/jpeg',ACL='public-read')



    else:
        continue

以编程方式,您必须在 directory_in_str 变量中提供此示例中硬编码的文件夹路径。然后,此代码将迭代搜索图像的每个文件,然后它将要求输入自定义名称,然后它将上传您的文件。

此外,您希望在您的网站上显示这些图像,因此使用ACL打开了图像的public_read,因此您可以直接使用s3链接在您的网页中嵌入图像。

https://s3.amazonaws.com/mausamrest/test/jkl.jpeg

以上文件是我用来测试此代码段的文件。你的图像将是这样的availbale。确保更改存储桶名称。 :)