简体   繁体   English

django boto3:将上传的文件保存在Amazon S3上

[英]django boto3: save uploaded file on Amazon S3

I am using boto3 to upload files to Amazon S3 in a django project. 我正在使用boto3在django项目boto3文件上传到Amazon S3。

settings.py : settings.py

...
AWS_ACCESS_KEY = 'xxxxxxxx'
AWS_SECRET_KEY = 'xxxxxxxx'
S3_BUCKET = 'xxxxx'
REGION_NAME = 'ap-southeast-1'

Template: 模板:

<form method=post action="..." enctype=multipart/form-data>
  {% csrf_token %}
  <input type="file" name="fileToUpload">
  <input type=submit value=Upload>
</form>

view: 视图:

from mysite.settings import AWS_ACCESS_KEY, AWS_SECRET_KEY, S3_BUCKET, REGION_NAME

import boto3
from boto3.session import Session

fileToUpload = request.FILES.get('fileToUpload')
session = Session(aws_access_key_id=AWS_ACCESS_KEY,
                  aws_secret_access_key=AWS_SECRET_KEY,
                  region_name=REGION_NAME)
s3 = session.resource('s3')
fpath = os.path.dirname(os.path.realpath(__file__)) + '/abc.png'
f = open(fpath, 'rb')
s3.Bucket(S3_BUCKET).put_object(Key='uploads/test2.png', Body=f)

For the existing file abc.png , it is uploaded to Amazon S3 correctly. 对于现有文件abc.png ,它已正确上传到Amazon S3。 However, how do I upload the user-selected file fileToUpload instead of the existing file abc.png ? 但是,如何上传用户选择的文件fileToUpload而不是现有文件abc.png

The following does the job: 以下是工作:

def upload(request):
    if request.method=='GET':
        return render(request, '<someTemplate>')
    # POST
    fileToUpload = request.FILES.get('fileToUpload')
    cloudFilename = '<someDirectory>/' + fileToUpload.name 

    session = boto3.session.Session(aws_access_key_id=AWS_ACCESS_KEY,
                                    aws_secret_access_key=AWS_SECRET_KEY)
    s3 = session.resource('s3')
    s3.Bucket(AWS_BUCKET_NAME).put_object(Key=cloudFilename, Body=fileToUpload)

    return redirect('<destinationTemplate>')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM