我想在 django 中使用 session_key 作为存储桶内的目录将图像保存到 S3 存储桶。
我创建了一个测试页面,将图像上传到存储桶中的设置位置,但不知道如何使用 session_key 动态设置上传位置。
我查看了文档,django-storages
如果不是因为我使用的是ModelForm
.
这是我的代码(我省略了带有存储桶名称和凭据的 settings.py):
storage_backends.py
from storages.backends.s3boto3 import S3Boto3Storage
class TestS3MediaStorage(S3Boto3Storage):
location = 'dev/'
default_acl = 'public-read'
file_overwrite = False
models.py
from .storage_backends import TestS3MediaStorage
class TestS3Upload(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
file = models.FileField(storage=TestS3MediaStorage())
forms.py
from .models import TestS3Upload
class TestS3UploadForm(forms.ModelForm):
class Meta:
model = TestS3Upload
fields = ['file']
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import TestS3UploadForm
def test_s3_upload(request):
# create session if it doesn't already exist
if not request.session.session_key:
request.session.create()
# not quite sure how to use this to set upload destination
session_key = request.session.session_key
if request.method == 'POST':
form = TestS3UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponse("upload successful!")
else:
form = TestS3UploadForm()
return render(
request,
'uploader/test_s3_upload.html',
{
'form': form
}
)
test_s3_upload.html
<h1>Test S3 file upload</h1>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload photo to S3 Bucket</button>
</form>
例如,当我运行代码并上传图像时car.jpg
,它成功上传,但 S3 存储桶内的路径是
<bucket-name>/dev/car.jpg
而且我要
<bucket-name>/dev/<session-key>/car.jpg
所需的软件包是boto3
,django-storages
以防万一任何想帮助回答的人都需要知道。