2017-11-11 408 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。但代碼上傳一切... –

相關問題