2 回答
TA贡献1829条经验 获得超13个赞
正如已经提到的,一种方法是直接使用该boto3
库。
另一种方法是使用(也在后台使用)save
的功能。django-storages
boto3
如果只有1个桶:
settings.py
...
INSTALLED_APPS = [
...
"storages",
...
]
...
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = 'my-access-key-id'
AWS_SECRET_ACCESS_KEY = 'my-secret-access-key'
# Depending on the AWS account used, you might also need to declare AWS_SESSION_TOKEN as an environment variable
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
...
views.py
from io import BytesIO
from django.core.files.storage import default_storage
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(('GET',))
def save_file(request):
file_name = "toguro.txt"
file_content = b"I have my full 100% power now!"
file_content_io = BytesIO(file_content)
default_storage.save(file_name, file_content_io)
return Response({"message": "File successfully saved"})
如果有很多桶:
settings.py
...
INSTALLED_APPS = [
...
"storages",
...
]
...
AWS_ACCESS_KEY_ID = 'my-access-key-id'
AWS_SECRET_ACCESS_KEY = 'my-secret-access-key'
# Depending on the AWS account used, you might also need to declare AWS_SESSION_TOKEN as an environment variable
...
views.py
from io import BytesIO
from rest_framework.decorators import api_view
from rest_framework.response import Response
from storages.backends.s3boto3 import S3Boto3Storage
# For a clear separation-of-concern, you should consider placing this code to its appropriate place
class MyStorage1(S3Boto3Storage):
bucket_name = 'my-bucket-1'
class MyStorage2(S3Boto3Storage):
bucket_name = 'my-bucket-2'
@api_view(('GET',))
def save_file(request):
file_name_1 = "toguro.txt"
file_name_2 = "sensui.txt"
file_content_1 = b"I have my full 100% power now!"
file_content_2 = b"I will release the S-Class demons!"
file_content_io_1 = BytesIO(file_content_1)
file_content_io_2 = BytesIO(file_content_2)
storage1 = MyStorage1()
storage2 = MyStorage2()
storage1.save(file_name_1, file_content_io_1)
storage2.save(file_name_2, file_content_io_2)
return Response({"message": "File successfully saved"})
TA贡献1859条经验 获得超6个赞
好的,所以我知道了应用错误的访问键并在views.py 中接受错误的输入
首先在views.py中获取正确的输入
pr.profile_picture = request.POST.get('profile_picture')
除了使用上述内容之外,以下内容会有所帮助:
pr.profile_picture = request.FILES["profile_picture"]
另外,当我将上面的内容与单个引号一起使用时,它将不起作用,所以请记住这一点。
将文件上传到S3
现在将有一些其他方法来执行此操作,但同时更改文件名。
我专门制作了另一个文件来处理图像并更改文件名。
import boto3
session = boto3.Session(
aws_access_key_id= 'secret sauce',
aws_secret_access_key = 'secret sauce'
)
class image():
def UploadImage(name,image):
filename = name+'_picture.jpg'
imagedata = image
s3 = boto3.resource('s3')
try:
object = s3.Object('bucket sauce', filename)
object.put(ACL='public-read',Body=imagedata,Key=filename)
return True
except Exception as e:
return e
上面的方法在views.py中调用
ret = image.UploadImage(pr.profile_username,pr.profile_picture)
将其放在 try 块中以避免错误。
添加回答
举报