2017-11-11 197 views
0

我试图从本地目录上传文件到S3文件夹。我能够将文件上传到S3存储桶,但我无法将文件上传到S3存储桶中的文件夹。使用python boto将文件上传到S3文件夹

任何人都可以帮忙吗?我在做什么错在这里..

下面是代码:

import os 
import sys 
import boto3 
import fnmatch 
import pprint 
import re 
import hashlib 

SOURCE_DIR = '/home/user/Downloads/tracks/' 
BUCKET_NAME = 'mybucket' 
S3_FOLDER = 'mybucket/folder1/' 

client = boto3.client('s3') 

s3 = boto3.resource('s3') 

def get_md5(filename): 
    f = open(filename, 'rb') 
    m = hashlib.md5() 

    while True: 
     data = f.read(10240) 
     if len(data) == 0: 
      break 
     m.update(data) 

    return m.hexdigest() 

def get_etag(filebase,filepath): 
    for item in bucket.objects.all(): 
     keyfile = S3_FOLDER + filebase 
     if(keyfile == item.key): 
      md5 = get_md5(filepath) 
      etag = item.e_tag.strip('"').strip("'") 

      if etag != md5: 
       print(filebase + ": " + md5 + " != " + etag) 
       return(files_to_upload.append(filepath)) 
     else: 
      return(files_to_upload.append(filepath)) 

files_to_upload = [] 
for root, dirnames, filenames in os.walk(SOURCE_DIR): 
    for filename in filenames: 
     filepath = os.path.join(root, filename) 
     get_etag(filename,filepath) 

for f in files_to_upload: 
    client.put_object(Bucket=BUCKET_NAME, Key=f) 

回答

0

文件夹并不真正存在于S3。您可以将文件名称(对象关键字)加上与文件夹路径类似的东西。

这并不完全清楚,我什么你的代码与文件路径做,但需要你的代码改成这样的:

for f in files_to_upload: 
    key = "my/s3/folder/name/" + f 
    client.put_object(Bucket=BUCKET_NAME, Key=key, Body=f) 

注意:您没有传递Body参数,所以我认为你的代码只是在S3中创建空对象。

+0

感谢马克。我现在明白了。有效。我试图只将修改或新文件上传到S3。但代码上传一切... –