在django rest框架中上载临时文件

在django rest框架中上载临时文件,django,file-upload,django-rest-framework,temporary-files,Django,File Upload,Django Rest Framework,Temporary Files,我正在尝试创建一种上传xlsx文件的方法,然后使用芹菜执行一些操作 我在想: 上载文件并临时保存的视图 使用芹菜来执行我想要的文件,然后删除它 我正在尝试这样做: class ImportMyFileView(APIView): 解析器\类=(FileUploadParser,) def post(self、request、filename、format=None): my_file=request.data[“file”] 以open(f“/tmp/{my_file.name}”、“wb+

我正在尝试创建一种上传xlsx文件的方法,然后使用芹菜执行一些操作

我在想:

  • 上载文件并临时保存的视图
  • 使用芹菜来执行我想要的文件,然后删除它
我正在尝试这样做:

class ImportMyFileView(APIView):
解析器\类=(FileUploadParser,)
def post(self、request、filename、format=None):
my_file=request.data[“file”]
以open(f“/tmp/{my_file.name}”、“wb+”)作为目标:
对于my_文件中的chunk.chunks():
destination.write(块)
#在这里叫芹菜
...
归还某物
我可以在我想要的地方生成文件,但问题是当我打开xlsx时。我在这里得到:

--X-BOUNDARY
内容配置:表单数据
内容类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

PK以下是我将如何使用DRF的内置功能:

import os

from rest_framework import serializers
from django.core.files.storage import FileSystemStorage

class UploadSerializer(serializers.Serializer):
    file = serializers.FileField()

class UploadView(APIView):
    ...
    def post(self, request):
        ser = UploadSerializer(request.data)
        ser.is_valid(raise_exception=True)

        fs = FileSystemStorage(tempfile.gettempdir())
        file_name = fs.save(content=ser.validated_data['file'])
        full_path = os.path.join(fs.location, file_name)

        celery_func.delay(file_name=full_path)
        return Response("Upload OK")

更可靠的方法是创建一个模型来表示要处理和使用的上传


一旦这种方法奏效,您就可以研究单独使用或与组合使用。不过,这是一个更大的学习曲线。

以下是我将如何做到这一点,依靠DRF的内置功能:

import os

from rest_framework import serializers
from django.core.files.storage import FileSystemStorage

class UploadSerializer(serializers.Serializer):
    file = serializers.FileField()

class UploadView(APIView):
    ...
    def post(self, request):
        ser = UploadSerializer(request.data)
        ser.is_valid(raise_exception=True)

        fs = FileSystemStorage(tempfile.gettempdir())
        file_name = fs.save(content=ser.validated_data['file'])
        full_path = os.path.join(fs.location, file_name)

        celery_func.delay(file_name=full_path)
        return Response("Upload OK")

更可靠的方法是创建一个模型来表示要处理和使用的上传

一旦这种方法奏效,您就可以研究单独使用或与组合使用。不过,这是一个更大的学习曲线