【问题标题】:Django store uploaded file in S3Django 存储在 S3 中上传的文件
【发布时间】:2014-09-27 10:53:49
【问题描述】:

我有一个使用 Django REST 框架向 API 使用者公开 POST 端点的类。

该代码应该接收文件上传,然后将其上传到 S3。文件正确上传到 Django 应用程序(file_obj.length 返回实际文件大小),并在 S3 中创建对象。但是,S3 中的文件大小为零。如果我记录file_obj.read() 的返回,它也是空的。

怎么了?

from django.conf import settings

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import FileUploadParser
from boto.s3.connection import S3Connection
from boto.s3.key import Key

from .models import Upload
from .serializers import UploadSerializer


class UploadList(APIView):
    parser_classes = (FileUploadParser,)

    def post(self, request, format=None):
        file_obj = request.FILES['file']

        upload = Upload(user=request.user, file=file_obj)
        upload.save()

        conn = S3Connection(settings.AWS_ACCESS_KEY, settings.AWS_SECRET_KEY)
        k = Key(conn.get_bucket(settings.AWS_S3_BUCKET))
        k.key = 'upls/%s/%s.png' % (request.user.id, upload.key)
        k.set_contents_from_string(file_obj.read())

        serializer = UploadSerializer(upload)

        return Response(serializer.data, status=201)

【问题讨论】:

    标签: python django amazon-s3 boto


    【解决方案1】:

    是否有可能已经在读取文件对象,也许是您的 Upload 类保存方法,您需要回到开头?

    file_obj.seek(0)
    

    【讨论】:

    • 完成了这项工作。非常感谢:-)
    【解决方案2】:

    你可以使用django存储

    pip install django-storages
    

    http://django-storages.readthedocs.org/en/latest/

    在你的模型中,

    def upload_image_to(instance, filename):
        import os
        from django.utils.timezone import now
        filename_base, filename_ext = os.path.splitext(filename)
        return 'posts/%s/%s' % (
            now().strftime("%Y%m%d"),
            instance.id
        )
    
    
    image = models.ImageField(upload_to=upload_image_to, editable=True, null=True, blank=True)
    

    在您的设置中,

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    AWS_S3_SECURE_URLS = False       # use http instead of https
    AWS_QUERYSTRING_AUTH = False     # don't add complex authentication-related query parameters for requests
    
    AWS_S3_ACCESS_KEY_ID = 'KEY'     # enter your access key id
    AWS_S3_SECRET_ACCESS_KEY = 'KEY' # enter your secret access key
    AWS_STORAGE_BUCKET_NAME = 'name.media'
    
    
    INSTALLED_APPS = (
        ...
        'storages',
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2015-09-25
      • 2017-09-17
      • 2018-04-12
      相关资源
      最近更新 更多