【问题标题】:uploading file to specific folder in S3 using boto3使用boto3将文件上传到S3中的特定文件夹
【发布时间】:2017-01-09 09:20:33
【问题描述】:

我的代码一切正常。我目前面临的唯一陷阱是我无法在 S3 存储桶中指定要放置文件的文件夹。这就是我所拥有的:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', filename)

我都试过了:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>/folder/', filename)

和:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', '/folder/'+filename)

如果有人对如何将其定向到特定文件夹(如果可能的话)有任何提示,请告诉我!

【问题讨论】:

  • S3 是一个对象存储,它不处理“文件夹名称”。整个“路径”必须用作键名的一部分。

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


【解决方案1】:

您不需要将 Key 值作为绝对路径传递。以下应该有效:

upload_file('/tmp/' + filename, '<bucket-name>', 'folder/{}'.format(filename))

【讨论】:

    【解决方案2】:

    我发现了我的问题。我对关键参数区域中的/folder/ 选项有正确的想法,但是,我不需要第一个/ 谢谢大家!这与上面 hjpotter92 的建议基本相同。

    【讨论】:

      【解决方案3】:

      在 python 3.x 中使用它

      s3.upload_file(file_path,bucket_name, '%s/%s' % (bucket_folder,dest_file_name))
      

      【讨论】:

        【解决方案4】:

        这是处理嵌套目录结构的方法,并且能够使用 boto 上传完整目录

        def upload_directory():
            for root, dirs, files in os.walk(settings.LOCAL_SYNC_LOCATION):
                nested_dir = root.replace(settings.LOCAL_SYNC_LOCATION, '')
                if nested_dir:
                    nested_dir = nested_dir.replace('/','',1) + '/'
        
                for file in files:
                    complete_file_path = os.path.join(root, file)
                    file = nested_dir + file if nested_dir else file
                    print "[S3_UPLOAD] Going to upload {complete_file_path} to s3 bucket {s3_bucket} as {file}"\
                        .format(complete_file_path=complete_file_path, s3_bucket=settings.S3_BUCKET, file=file)
                    s3_client.upload_file(complete_file_path, settings.S3_BUCKET, file)
        

        【讨论】:

          【解决方案5】:

          你可以用put_object代替upload_file

          file = open(r"/tmp/" + filename)
          response = s3.meta.client.Bucket('<bucket-name>').put_object(Key='folder/{}'.format(filename), Body=file)
          

          【讨论】:

            【解决方案6】:

            试试看:

            s3.meta.client.upload_file(Filename=filename_and_full_path, Bucket=my_bucket, Key=prefix_key_plus_filename_only)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-05-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多