2015-01-23 3 views
1

Привет Я не могу загрузить файл на S3 с помощью boto. Он выходит из строя со следующим сообщением об ошибке. Может кто-то мне помочь, я новичок в python и boto.Ошибка загрузки Amazon S3 с помощью boto + Python

from boto.s3 import connect_to_region 
from boto.s3.connection import Location 
from boto.s3.key import Key 
import boto 
import gzip 
import os 

AWS_KEY = '' 
AWS_SECRET_KEY = '' 
BUCKET_NAME = 'mybucketname' 

conn = connect_to_region(Location.USWest2,aws_access_key_id = AWS_KEY, 
     aws_secret_access_key = AWS_SECRET_KEY, 
     is_secure=False,debug = 2 
     ) 

bucket = conn.lookup(BUCKET_NAME) 
bucket2 = conn.lookup('unzipped-data') 
rs = bucket.list() 
rs2 = bucket2.list() 

compressed_files = [] 
all_files = [] 
files_to_download = [] 
downloaded_files = [] 
path = "~/tmp/" 

# Check if the file has already been decompressed 

def filecheck(): 
    for filename in bucket.list(): 
     all_files.append(filename.name) 

    for n in rs2: 
     compressed_files.append(n.name) 
    for file_name in all_files: 
      if file_name.strip('.gz') in compressed_files: 
       pass; 
      elif '.gz' in file_name and 'indeed' in file_name: 
       files_to_download.append(file_name) 


# Download necessary files     
def download_files(): 
    for name in rs: 
     if name.name in files_to_download: 
      file_name = name.name.split('/') 

      print('Downloading: '+ name.name).strip('\n') 
      file_name = name.name.split('/') 
      name.get_contents_to_filename(path+file_name[-1]) 
      print(' - Completed') 

      # Decompressing the file 
      print('Decompressing: '+ name.name).strip('\n') 
      inF = gzip.open(path+file_name[-1], 'rb') 
      outF = open(path+file_name[-1].strip('.gz'), 'wb') 
      for line in inF: 
       outF.write(line) 
      inF.close() 
      outF.close() 
      print(' - Completed') 

      # Uploading file 
      print('Uploading: '+name.name).strip('\n') 
      full_key_name = name.name.strip('.gz') 
      k = Key(bucket2) 
      k.key = full_key_name 
      k.set_contents_from_filename(path+file_name[-1].strip('.gz')) 
      print('Completed') 

      # Clean Up 
      d_list = os.listdir(path) 
      for d in d_list: 
       os.remove(path+d) 


# Function Calls    
filecheck() 
download_files() 

Сообщение об ошибке:

Traceback (most recent call last): 
    File "C:\Users\Siddartha.Reddy\workspace\boto-test\com\salesify\sid\decompress_s3.py", line 86, in <module> 
    download_files() 
    File "C:\Users\Siddartha.Reddy\workspace\boto-test\com\salesify\sid\decompress_s3.py", line 75, in download_files 
    k.set_contents_from_filename(path+file_name[-1].strip('.gz')) 
    File "C:\Python27\lib\site-packages\boto\s3\key.py", line 1362, in set_contents_from_filename 
    encrypt_key=encrypt_key) 
    File "C:\Python27\lib\site-packages\boto\s3\key.py", line 1293, in set_contents_from_file 
    chunked_transfer=chunked_transfer, size=size) 
    File "C:\Python27\lib\site-packages\boto\s3\key.py", line 750, in send_file 
    chunked_transfer=chunked_transfer, size=size) 
    File "C:\Python27\lib\site-packages\boto\s3\key.py", line 951, in _send_file_internal 
    query_args=query_args 
    File "C:\Python27\lib\site-packages\boto\s3\connection.py", line 664, in make_request 
    retry_handler=retry_handler 
    File "C:\Python27\lib\site-packages\boto\connection.py", line 1070, in make_request 
    retry_handler=retry_handler) 
    File "C:\Python27\lib\site-packages\boto\connection.py", line 1029, in _mexe 
    raise ex 
socket.error: [Errno 10053] An established connection was aborted by the software in your host machine 

У меня нет проблем с загрузкой файлов, но загрузка не выполняется для какой-то странной причине.

+1

есть ли шанс у вас есть какие-то брандмауэра или антивирусной программы, запущенной, что мешает загрузке? – garnaat

+0

@ garnaat .. У меня не было проблем с загрузкой небольших файлов размером около 1 ~ 2 гигабайта. эта ошибка возникла при загрузке файлов размером 6 гигабайт. Так что-то связано с размером файлов – Siddarth

ответ

3

Если проблема размера файлов (> 5 Гб), вы должны использовать многослойные загрузки:

http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html

поиска multipart_upload в документации: http://boto.readthedocs.org/en/latest/ref/s3.html#module-boto.s3.multipart

Кроме того, увидеть этот вопрос для связанного с этим вопроса:

How can I copy files bigger than 5 GB in Amazon S3?

Процесс немного неинтуитивный. Вам нужно:

  • выполнение initiate_multipart_upload(), хранение возвращаемого объекта
  • разбить файл на куски (либо на диске, или считываются из памяти с помощью CStringIO)
  • кормить части последовательно в upload_part_from_file()
  • запустить complete_upload() на хранимого объекта
+0

Спасибо человеку! Это работает .. – Siddarth

+0

Нет проблем! – Meridius

Смежные вопросы