如何使用 django 应用程序在 AWS S3 中上传文件?

杰·沙姆纳尼

我在上传用户个人资料图片时遇到问题。现在,当我在 Django admin 中创建一个用户并从管理仪表板上传文件时,它可以正常工作并且没有错误。它应该进入我的 AWS S3 存储桶,但这显然不可行,我一直在寻找解决方案 3 到 4 天,但没有成功或任何令人满意的结果。我显然不会向用户提供仪表板访问权限。使用的数据库是MongoDB,数据库引擎是djongo。

这是我的settings.py

INSTALLED_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 = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

我的网址.py

from django.urls import path, include
from .views import signup_form
urlpatterns = [
    path('signup', signup_form, name='signup'),
]

我的模型.py

class 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)

我的意见.py

def signup_form(request):
    if request.method == 'POST':
        if request.POST.get('profile_username') and request.POST.get('profile_name') and request.POST.get('profile_email') and request.POST.get('profile_dob') and request.POST.get('profile_password') and request.POST.get('profile_picture'):
            pr = profile()
            pr.profile_username = request.POST.get('profile_username')
            pr.profile_name = request.POST.get('profile_name')
            pr.profile_email = request.POST.get('profile_email')
            pr.profile_password = request.POST.get('profile_password')
            pr.profile_dob = request.POST.get('profile_dob')
            pr.profile_picture = request.POST.get('profile_picture')
            try:
                pr.save()
                print('setProfile success')
                return redirect('index.html')
            except Exception as e:
                return render(request, 'signup.html')
            return render(request, 'signup.html') 
    else:
        return render(request, 'signup.html')

我的注册表单“signup.html”

{% extends 'index.html' %}
{% block content %}

<form method='POST'>
    {% csrf_token %}
    <div>
        <label>USERNAME</label>
        <input type="text" placeholder="" name="profile_username" required/>
    </div><br>
    <div>
        <label>NAME</label>
        <input type="text" placeholder="" name="profile_name" required/>
    </div><br>
    <div>
        <label>EMAIL</label>
        <input type="email" placeholder="" name="profile_email" required/>
    </div><br>
    <div>
        <label>Password</label>
        <input type="password" placeholder="" name="profile_password" required/>
    </div><br>
    <div>
        <label>DOB</label>
        <input type="date" placeholder="" name="profile_dob" required/>
    </div><br>
    <div>
        <label>Profile Picture</label>
        <input type="file" placeholder="" name="profile_picture" required/>
    </div><br>
    <button type="submit">submit</button>
</form>
<a href="/">Home</a>
{% endblock content %}

另外,我想更改上传文件的名称,Django 管理员上传的文件采用原样的文件名,但是当我将此应用程序公开时,文件名必须正确,以避免被覆盖或有多次使用同一个文件

杰·沙姆纳尼

好的,所以我有一些应用错误的访问键并在 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 块中以避免错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Python在myBucket中上传CSV文件并在S3 AWS中读取文件

在Django应用程序中上传到非美国标准AWS S3存储桶时出错;美国标准铲斗完美运行

如何为 S3 中上传的文件启用 AWS-S3 安全策略

使用 AWS S3 在 node.js 应用程序中处理文件上传和存储

如何从Angular 8在AWS S3中上传文件

使用ruby在AWS S3的同一目录中上传多个文件

如何将Django + Angular解耦应用程序中的照片/文件正确上传到S3?

如何使用 JMeter 在 JSF 应用程序中上传文件

Coldfusion:尝试在 AWS S3 中上传文件

在 AWS S3 SDK 中上传文件

Django - 用户在视图中上传的 S3 文件

如何使用 aws-sdk for javascript 将图像从 iOS 应用程序(使用 Kony 构建)上传到 AWS S3?

使用Web API在Ionic应用程序中上传文件

如何在AWS Lambda(python)中上传zip文件夹而不存储在S3中

使用CircleCI部署到AWS S3后如何运行应用程序?

iOS 应用程序:如何使用 kingfisher/sdwebimage 下载 aws s3 映像

Django:将CSV文件上传到AWS S3

从(AngularJS)单页应用程序直接(简单!)将AJAX上传到AWS S3

从移动应用程序将图像上传到AWS S3

如何在AWS Elastic Beanstalk中托管的Django应用的S3存储桶中保存Django日志文件

在Django中上传后如何访问文件?

如何在Django中上传文件?

使用 Django 在 Heroku 部署中上传文件

使用 cakephp 3 上传 AWS S3 文件

如何修复 AWS 代码构建 apt-get 更新退出状态 100 以便反应应用程序上传到 s3

如何更改CLI在CF Push中上传应用程序文件所使用的临时路径

如何使用 Multer 在 MERN Stack 应用程序中上传图像文件

通过Spring Boot应用程序将日志文件存储在AWS S3中

从我的应用程序控制对AWS S3文件的访问