我是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)代码在这里
答案 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']