【问题标题】:Remove absolute path while uploading file on S3在 S3 上上传文件时删除绝对路径
【发布时间】:2017-06-21 22:07:22
【问题描述】:

我正在尝试使用以下代码在我的存储桶中上传 S3 上的文件,该代码运行良好。

#!/usr/bin/python
import os
import boto
import boto.s3.connection
from boto.s3.key import Key
from boto.s3.connection import S3Connection
from datetime import datetime
try:


    conn = boto.s3.connect_to_region('us-east-1',
    aws_access_key_id = 'AKXXXXXXXXXXXXA',
    aws_secret_access_key = 'cXXXXXXXXXXXXXXXXXXXXXXXXX2',
    calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )

    print conn
    filename = '/home/rahul/GitDjangopostgres/AWSNewView/company/ExtraPaymentDocuments/Argus_ATM_e_surveillance/Gujarat/Ahmedabad/P3DCAM04/cecb834f-ae85-49e3-b8a1-a6nC^U)3GcZ)M62d643aa7-d047-498c-bf59-8__Invoice (7).pdf'

    bucket = conn.get_bucket('bucketName', validate=False)
    key_name = filename
    print "file to upload",key_name

    secure_https_url = 'https://{host}/{bucket}{key}'.format(
    host=conn.server_name(),
    bucket='bucketName',
    key=key_name)

    print "secure_https_url",secure_https_url

    k = bucket.new_key(key_name)
    mp = k.set_contents_from_filename(key_name)

    print "File uploaded successfully"
except Exception,e:
    print str(e)
    print "error"

现在的问题是我的文件名是'/home/rahul/GitDjangopostgres/AWSNewView/company/ExtraPaymentDocuments/Argus_ATM_e_surveillance/Gujarat/Ahmedabad/P3DCAM04/cecb834f-ae85-49e3-b8a1-a6nC^U)3GcZ)M62d643aa7-d047-498c-bf59-8__Invoice (7).pdf',它正在创建分层存储桶并存储我的文件。所以我得到的文件路径为https://s3.amazonaws.com/bucketName/home/rahul/GitDjangopostgres/AWSNewView/company/ExtraPaymentDocuments/Argus_ATM_e_surveillance/Gujarat/Ahmedabad/P3DCAM04/cecb834f-ae85-49e3-b8a1-a6nC^U)3GcZ)M62d643aa7-d047-498c-bf59-8__Invoice (7).pdf。我想将此层次结构更改为https://s3.amazonaws.com/bucketName/ExtraPaymentDocuments/Argus_ATM_e_surveillance/Gujarat/Ahmedabad/P3DCAM04/cecb834f-ae85-49e3-b8a1-a6nC^U)3GcZ)M62d643aa7-d047-498c-bf59-8__Invoice (7).pdf。是否有任何选项可以使用 boto 或者我应该使用 python,因为要在 s3 上上传文件,它需要文件的绝对路径,因为我使用的是Django,这是我的celery 任务。

【问题讨论】:

    标签: python django amazon-s3 boto


    【解决方案1】:

    函数set_contents_from_filename(key_name) 明白,无论键名是什么,它都会将它按原样放在s3 中。如果您的键名包含任何/,那么它将创建层次结构。对于您的情况,我建议您创建两条路径。一个是包含文件的基本本地路径。基本本地路径将包含您要上传到 s3 的所有文件(使用 os.path.join 创建路径)然后是 aws 路径,它是您要在 s3 存储桶中创建的层次结构。例如,您可以将 aws 路径声明为:

    /ExtraPaymentDocuments/Argus_ATM_e_surveillance/Gujarat/Ahmedabad/P3DCAM04
    

    然后将本地文件名附加到参数 key_name,然后将其传递给函数 new_key。 Boto 在这里可以正常工作。

    示例: 在 s3 存储中创建您想要的 s3 路径,并添加一个包含您要上传的所有文件的基本本地路径。必须附加文件名才能创建文件。 new_key 函数将创建一个密钥,即可用于存储文件的路径。 set_contents_from_filename 函数将获取一个本地文件路径,并使用上面函数中提供的键(路径)将该文件存储到 s3。

    k = bucket.new_key(s3_path + filename)
    mp = k.set_contents_from_filename(base_local_path _ filename)
    

    【讨论】:

    • 你的意思是说k = bucket.new_key(key_name1) mp = k.set_contents_from_filename(key_name2)我可以把key_name1和key_name2不一样吗?
    • 查看最终编辑。它应该非常适合您。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2016-04-20
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2016-11-19
    • 1970-01-01
    相关资源
    最近更新 更多