python上传大文件s3_python – Django在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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django ,有多种方式可以实现文件上传以及多个文件上传的功能。下面介绍三种常用的方式。 ### 1. 使用 Django 自带的文件上传模块 Django 自带了文件上传模块 `django.core.files.uploadhandler`,可以使用它来处理文件上传。使用该模块的步骤如下: 1. 在 `settings.py` 配置文件上传路径: ```python MEDIA_ROOT = '/path/to/media/' MEDIA_URL = '/media/' ``` 2. 在需要上传文件的视图函数,使用 `request.FILES` 获取上传文件,然后保存文件: ```python def upload_file(request): if request.method == 'POST' and request.FILES: file = request.FILES['file'] with open(os.path.join(settings.MEDIA_ROOT, file.name), 'wb+') as destination: for chunk in file.chunks(): destination.write(chunk) ``` 3. 在模板添加文件上传表单: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file"> <button type="submit">上传</button> </form> ``` ### 2. 使用第三方插件 django-formtools django-formtools 是一个 Django 第三方插件,提供了一些常用的表单处理工具,其包括文件上传。使用该插件的步骤如下: 1. 安装 django-formtools: ``` pip install django-formtools ``` 2. 在视图函数使用 `FileUploadView` 处理文件上传: ```python from formtools.wizard.views import SessionWizardView from django.core.files.storage import FileSystemStorage class FileUploadView(SessionWizardView): file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'uploads')) def done(self, form_list, **kwargs): file_data = [form.cleaned_data.get('file') for form in form_list] for file in file_data: with open(os.path.join(settings.MEDIA_ROOT, file.name), 'wb+') as destination: for chunk in file.chunks(): destination.write(chunk) return HttpResponse('文件上传成功') ``` 3. 在模板设置表单: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ wizard.management_form }} {% for form in wizard.forms %} {{ form.as_p }} {% endfor %} <button type="submit">上传</button> </form> ``` ### 3. 使用第三方插件 django-storages django-storages 是一个 Django 第三方插件,提供了多种文件存储后端支持,包括本地文件系统、Amazon S3、Google Cloud Storage 等。使用该插件的步骤如下: 1. 安装 django-storages: ``` pip install django-storages ``` 2. 在 `settings.py` 配置文件存储后端: ```python DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_ACCESS_KEY_ID = 'your-access-key-id' AWS_SECRET_ACCESS_KEY = 'your-secret-access-key' AWS_STORAGE_BUCKET_NAME = 'your-bucket-name' AWS_S3_REGION_NAME = 'your-region-name' ``` 3. 在视图函数使用 `request.FILES` 获取上传文件,然后保存文件: ```python from django.core.files.storage import default_storage def upload_file(request): if request.method == 'POST' and request.FILES: file = request.FILES['file'] default_storage.save(file.name, file) ``` 4. 在模板添加文件上传表单: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file"> <button type="submit">上传</button> </form> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值