首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Django的AWS文件上传问题

使用Django的AWS文件上传问题
EN

Stack Overflow用户
提问于 2020-10-21 20:11:23
回答 1查看 27关注 0票数 0

我已经通过cpanel部署了我的django应用。静态和媒体文件通过亚马逊网络服务S3正确提供。但当我尝试上传文件/图片时,它不会上传,也不会显示错误,并且会重定向到主页,其中包含上传文件的页面的url。主页URL:www.example.com,上传页面URL:www.example.com/upload

存储桶访问是公有的。IAM用户拥有完全访问S3的权限,我将非常感谢您的宝贵时间和帮助。

代码语言:javascript
运行
复制
CORS Policy

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
代码语言:javascript
运行
复制
Bucket Policy
{
    "Version": "2012-10-17",
    "Id": "Policy1603207554013",
    "Statement": [
        {
            "Sid": "Stmt1603207062804",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::django-bucket/*"
        },
        {
            "Sid": "Stmt1603207552031",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::085459706277:user/django_user"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::django-bucket/*",
                "arn:aws:s3:::django-bucket"
            ]
        }
    ]
}
代码语言:javascript
运行
复制
settings.py

AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_DEFAULT_ACL = None
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
# s3 static settings
STATIC_LOCATION = 'static'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'
STATICFILES_STORAGE = 'stock_app.storage_backends.StaticStorage'
# s3 public media settings
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
DEFAULT_FILE_STORAGE = 'stock_app.storage_backends.PublicMediaStorage'
代码语言:javascript
运行
复制
storage_backends.py

from storages.backends.s3boto3 import S3Boto3Storage
from django.conf import settings


class StaticStorage(S3Boto3Storage):
    location = 'static'
    default_acl = 'public-read'


class PublicMediaStorage(S3Boto3Storage):
    location = 'media'
    default_acl = 'public-read'
    file_overwrite = False
代码语言:javascript
运行
复制
models.py

class Upload(models.Model):
    file = models.FileField(upload_to='data base')

    def __str__(self):
        return f'{self.file} Success'
代码语言:javascript
运行
复制
forms.py

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = Upload
        fields = ['file']
代码语言:javascript
运行
复制
views.py

@login_required
def upload_file(request):

    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            file = request.FILES['file'] 
            output = files_to_database(file) 

            if not output: #checks to see if file is not already in database 
                form.save()
            
            return redirect('upload')
    else:
        form = UploadFileForm()
        

    return render(request, 'stock_app/upload.html', {'form': form})
EN

回答 1

Stack Overflow用户

发布于 2020-11-01 21:22:06

存储桶策略中存在问题。在这个网站上找到了答案:https://testdriven.io/blog/storing-django-static-and-media-files-on-amazon-s3/对我有效的策略是:

代码语言:javascript
运行
复制
Bucket Policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64463235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档