使用CLI将多个图像上传到Amazon AWS

时间:2018-07-02 09:44:19

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

我想使用CLI将100张图像上传到s3存储桶。除了一张一张地上传图片之外,还有其他方法可以将100张图片一起上传吗? 我的代码是这样的

import boto3
import sys
#s3-rish = argv[0]
filen = sys.argv[1]
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
   print(bucket.name)
#filen='messi.jpeg'
data = open(filen, 'rb')
x=s3.Bucket('bucket-rishabh').put_object(Key=""+filen, Body=data,Metadata=         {'FullName': sys.argv[2]})
x.Acl().put(ACL='public-read')
print x
# Works Properly enter code here
# Takes in image input as command line arguments first image path than image name'

可以对输入100张图像的这些代码行进行哪些修改?

2 个答案:

答案 0 :(得分:1)

您的代码使用的是适用于Python的AWS开发工具包(“ boto3”),而不是AWS Command-Line Interface (CLI)。 AWS CLI也用Python编写,并使用boto调用AWS。

没有Amazon S3 API调用可上传多个文件。您将需要分别上传每个文件。通过一些巧妙的编程,您可以使用多个线程同时上传多个文件,但是每个API调用只会上传单个文件。

AWS CLI表示包括了聪明的编程,因此您可以使用aws s3 cpaws s3 sync指定多个文件,它将执行并行上传。

答案 1 :(得分:0)

您可以将所有图像存储在一个特定的文件夹中,然后使用这种python脚本上传在文件夹中找到的所有图像:

import os
import boto3

s3 = boto3.resource('s3')

directory_in_str="E:\\streethack\\hold"   # change directory path to your images folder

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)     
        file = open(strg,'rb')
        object = s3.Object('bucketname',filename)
        object.put(Body=file,ContentType='image/jpeg')



    else:
        continue

基本上,此脚本将循环访问文件夹中的每个文件,如果它是图像,则会将该图像上载到存储桶中。

如果您希望在上传之前为图片指定自定义名称,则可以进行一些修改:

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('bucketname',strg2)
        object.put(Body=file,ContentType='image/jpeg',ACL='public-read')



    else:
        continue