第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用 django 應(yīng)用程序在 AWS S3 中上傳文件?

如何使用 django 應(yīng)用程序在 AWS S3 中上傳文件?

喵喔喔 2023-12-26 16:16:02
我在上傳用戶個(gè)人資料圖片時(shí)遇到問題。現(xiàn)在,當(dāng)我在 Django 管理中創(chuàng)建用戶并從管理儀表板上傳文件時(shí),它可以正常工作,沒有錯(cuò)誤。它按照應(yīng)有的方式進(jìn)入我的 AWS S3 存儲(chǔ)桶,但這顯然是不可行的,我一直在尋找解決方案 3 到 4 天,但沒有成功或沒有任何令人滿意的結(jié)果。我顯然不會(huì)向用戶提供儀表板訪問權(quán)限。使用的數(shù)據(jù)庫(kù)是MongoDB,數(shù)據(jù)庫(kù)引擎是djongo。這是我的設(shè)置.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'我的網(wǎng)址.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 上傳的文件采用文件名,但是當(dāng)我將這個(gè)應(yīng)用程序公開給公眾時(shí),文件名必須正確,以避免被覆蓋或具有同一個(gè)文件多次
查看完整描述

2 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

正如已經(jīng)提到的,一種方法是直接使用該boto3庫(kù)。

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

如果只有1個(gè)桶:

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"})


查看完整回答
反對(duì) 回復(fù) 2023-12-26
?
BIG陽

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

好的,所以我知道了應(yīng)用錯(cuò)誤的訪問鍵并在views.py 中接受錯(cuò)誤的輸入


首先在views.py中獲取正確的輸入


pr.profile_picture = request.POST.get('profile_picture')

除了使用上述內(nèi)容之外,以下內(nèi)容會(huì)有所幫助:


pr.profile_picture  = request.FILES["profile_picture"]

另外,當(dāng)我將上面的內(nèi)容與單個(gè)引號(hào)一起使用時(shí),它將不起作用,所以請(qǐng)記住這一點(diǎn)。


將文件上傳到S3


現(xiàn)在將有一些其他方法來執(zhí)行此操作,但同時(shí)更改文件名。


我專門制作了另一個(gè)文件來處理圖像并更改文件名。


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中調(diào)用


ret = image.UploadImage(pr.profile_username,pr.profile_picture)

將其放在 try 塊中以避免錯(cuò)誤。


查看完整回答
反對(duì) 回復(fù) 2023-12-26
  • 2 回答
  • 0 關(guān)注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)