亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 django 應用程序在 AWS S3 中上傳文件?

如何使用 django 應用程序在 AWS S3 中上傳文件?

喵喔喔 2023-12-26 16:16:02
我在上傳用戶個人資料圖片時遇到問題?,F在,當我在 Django 管理中創建用戶并從管理儀表板上傳文件時,它可以正常工作,沒有錯誤。它按照應有的方式進入我的 AWS S3 存儲桶,但這顯然是不可行的,我一直在尋找解決方案 3 到 4 天,但沒有成功或沒有任何令人滿意的結果。我顯然不會向用戶提供儀表板訪問權限。使用的數據庫是MongoDB,數據庫引擎是djongo。這是我的設置.pyINSTALLED_APPS = [    'profileupload',    's3direct',    'storages',    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'django.contrib.humanize',]STATIC_URL = '/static/'MEDIA_ROOT = os.path.join(BASE_DIR, 'media')MEDIA_URL = '/media/'AWS_SECRET_ACCESS_KEY = 'MY_SPECIAL_KEY'AWS_ACCESS_KEY_ID = 'MY_SPECIAL_KEY_NAME'AWS_STORAGE_BUCKET_NAME = 'S3_BUCKET'AWS_S3_FILE_OVERWRITE = FalseAWS_DEFAULT_ACL = NoneDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'我的網址.pyfrom django.urls import path, includefrom .views import signup_formurlpatterns = [    path('signup', signup_form, name='signup'),]我的模型.pyclass profile(models.Model):    profile_id = models.AutoField(primary_key=True,unique=True)    profile_username = models.CharField(max_length=100,unique=True)    profile_name = models.CharField(max_length=150)    profile_email = models.EmailField(max_length=200)    profile_create_time = models.DateField(auto_now_add=True)    profile_dob = models.DateField()    profile_password = models.CharField(max_length=50, null=True)    profile_picture = models.ImageField(default='default.jpg', upload_to='profile_pics')    def __str__(self):        return str(self.profile_username)另外,我想更改上傳文件的名稱,由 Django admin 上傳的文件采用文件名,但是當我將這個應用程序公開給公眾時,文件名必須正確,以避免被覆蓋或具有同一個文件多次
查看完整描述

2 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

正如已經提到的,一種方法是直接使用該boto3庫。

另一種方法是使用(也在后臺使用)save的功能。django-storagesboto3

如果只有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"})


查看完整回答
反對 回復 2023-12-26
?
BIG陽

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 塊中以避免錯誤。


查看完整回答
反對 回復 2023-12-26
  • 2 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號