获取文件名boto3 python

时间:2018-11-05 09:59:06

标签: amazon-s3 flask boto3

我是flask和boto3的新手,想创建一个简单的上载表单到s3亚马逊,我需要使用现有文件名将文件保存在s3上,并返回指向该文件的链接。

两个问题:

1)在下面的示例中,文件始终以名称“ test”上传。如果上载文件名为“ my file.pdf”,我需要将文件上传到s3,并使用相同的名称(“ file.pdf”)。 我相信可以根据要求完成,但我不知道具体如何。怎么做?

2)如何返回指向我刚刚上传的文件的链接? (我不知道)

下面是我的代码

@app.route('/')
def index():
    return '''
    <form method="post" enctype="multipart/form-data" action="upload">
     <input type="file" name="file" multiple>
     <input type="submit">
    </form>
    '''

@app.route('/upload', methods=['POST', 'GET'])
def upload():
    s3 = boto3.resource('s3')
    s3.Bucket('dimkzn').put_object(='test', Body=request.files['file'])
    return 'file save! to S3'

如果名称 =='主要':     app.run(debug = True)代码在这里

3 个答案:

答案 0 :(得分:1)

在上载功能中,您缺少="test"所在的 Key 参数名称,这就是为什么每个文件都被保存为测试的原因。您可以通过request.files

中的文件对象传递文件名
@app.route('/upload', methods=['POST', 'GET'])
def upload():
    s3 = boto3.resource('s3')
    s3.Bucket('dimkzn').put_object(Key=request.files['file'].filename, Body=request.files['file'])
    return 'file save! to S3'

URL路径将为https://s3-<region>.amazonaws.com/dimkzn/<filename>

如果您希望将文件上传到子文件夹,则S3中实际上并不存在文件夹,但是您可以通过更改文件的密钥来创建文件夹结构。 E.G

@app.route('/upload', methods=['POST', 'GET'])
def upload():
    s3 = boto3.resource('s3')
    s3.Bucket('dimkzn').put_object(Key=f"media/example/{request.files['file'].filename}", Body=request.files['file'])
    return 'file save! to S3'

将文件上传到:

https://s3-<region>.amazonaws.com/dimkzn/media/example/<filename>

答案 1 :(得分:0)

我认为您的问题就在这里

s3.Bucket('dimkzn').put_object(='test', Body=request.files['file'])

您在='test'之前缺少参数名称。从您的代码中看不到request.files ['file']返回的内容:文件名还是文件内容?

正确的语法是

object = bucket.put_object(
    Body=b'bytes'|file,
    Key='filename')

...其中,正文是文件的内容,密钥是文件名。

成功后,您可以自己构建链接,如下所示:

https://s3-<region>.amazonaws.com/<bucketname>/<filename>

祝你好运!

答案 2 :(得分:0)

您缺少的“键”应该是这样的: s3.Bucket('dimkzn')。put_object(Key ='test',Body = request.files ['file']