[英]Django store uploaded file in S3
我有這個類使用Django REST框架將POST端點暴露給API使用者。
該代碼應該接收文件上傳,然后將其上傳到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)
有可能某些東西正在讀取文件對象,也許你的上傳類保存方法,你需要回頭看?
file_obj.seek(0)
您可以使用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',
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.