当前位置: 首页 > 知识库问答 >
问题:

如何使用Django Rest APi上传文件

纪晨
2023-03-14

有没有人可以帮助我如何在django rest api中使用POST方法上传文件,例如当我启动时

curl -X POST 127.0.0.1:8000/api/v1/assets/ -d '{"name" = "my image   ","source"="/root/images/my_image2.jpg"}' -H "Content-Type: application/json"
from django.forms import widgets
from rest_framework import serializers
from .models import Asset

class AssetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Asset
from .serializers import AssetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from rest_framework import status
from rest_framework.decorators import api_view


class AssetAdd(APIView):


    def post(self, request, format=None):
        serializer = AssetSerializer(data=request.DATA)
        print serializer.data

        if serializer.is_valid():

            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class Asset(models.Model):

    key = models.CharField(max_length=8, unique=True, editable=False)
    name = models.CharField(_('name'), max_length=200)
    source = models.FileField(_('file'), upload_to=upload_to, storage=default_storage)

    ext = models.CharField(max_length=15, editable=False)
    type = models.PositiveIntegerField(choices=ASSET_TYPE, max_length=15, editable=False)
    size = models.PositiveIntegerField(max_length=32, default=0, editable=False)

    _file_meta = models.TextField(editable=False, null=True, blank=True)

    public = models.BooleanField(default=False)
    position = models.PositiveIntegerField(default=1)

    object_id = models.PositiveIntegerField(default=1)
    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True, auto_now=True)

我是Django REST API的新手,我阅读了文档http://www.django-rest-framework.org/api-guide/parsers.html#FileuploadParser,但仍然不知道如何实现它

共有1个答案

洪捷
2023-03-14

首先,您需要在视图中定义一个解析器。这是因为API需要知道要查找哪些头。浏览器将文件作为表单数据传输,因此需要同时使用MultiPartParser和FormParser。您还可以使用FileUploadParser,但需要确保客户端发送的HTTP头正确。

from rest_framework.parsers import MultiPartParser, FormParser

class AssetAdd(APIView):
    parser_classes = (MultiPartParser, FormParser,)

然后,在post方法中,您的文件将出现在FILES Querydict:

def post(self, request, format=None):
    my_file = request.FILES['file_field_name']
    filename = '/tmp/myfile'
    with open(filename, 'wb+') as temp_file:
        for chunk in my_file.chunks():
            temp_file.write(chunk)

    my_saved_file = open(filename) #there you go
 类似资料:
  • 我正在尝试使用多部分实体方法上传文件。但它失败,错误说{“错误”:“文件参数值'无'无效”} 我的代码是: File File = new File(" C:/Users/SST-06/Desktop/new . txt "); 我的实体文件包含所有提到的参数。 -hkYO-pblk 0 uqlxjtvklrbkosxz 7 mye-8 wbvbvanx Content-Disposition:f

  • 我可以使用将文件上载为 上面的代码运行良好。 现在,我想对同一作业使用。我试着在网上搜索并实现代码。但我无法得到结果。 html代码如下所示: 代码中没有任何形式。如何解决问题?

  • 我写了一个可以上传文件到服务器的服务,现在我正在放心地编写它的集成测试。功能代码如下: 如果我添加标题信息“content-type=multipart/form-data”,我将得到这样的消息:“400-Request不是一个多部分请求,有关更多信息,请参见详细信息”。这部分也让我感到困惑,因为在上面的图像中,您可以看到我正在发送一个“表单数据”文件,这怎么可能不是一个多部分请求呢? 不管怎样,

  • 我需要使用Angular2上传文件,我在客户端使用它,在服务器端使用WebAPI。如何使用此组合来实现

  • 问题内容: 我知道,关于这个主题的话题并非没有,但请耐心等待。我想使用Ajax或等效文件将文件上传到服务器。 我猜我配置ajax函数的方式存在问题,因为在调试模式下,除之外的所有数据均会返回。 我做错了什么吗? 问题答案: 回顾过去,较旧的答案不切实际,不建议使用。暂停整个Javascript以仅上传文件, 您可能会在上传过程中触发其他功能 。 如果您仅将JQuery用于,则我建议使用: Axio

  • 问题内容: 谁能告诉我如何使用nodejs和HAPI上传文件? 我在处理程序中获取二进制数据。 这是我的html代码: 这是我的Nodejs代码: 问题答案: 最后,我得到了使用HAPI上传大型文件的解决方案,并感谢Roman。 解决方法如下: server.js代码 处理程序代码:

  • 问题内容: 当我使用XMLHttpRequest时,使用可以正确上传文件。但是,当我切换到时,我的代码将中断。 这是有效的原始代码: 这是我失败的尝试: 我究竟做错了什么?如何使用AJAX正确上传文件? 问题答案: 您必须添加方法,以便jQuery不会更改标头或数据(这会破坏当前代码)。

  • 问题内容: 我想知道如何使用cURL或PHP中的任何其他文件上传文件。我在Google中搜索了很多次,但没有结果。 换句话说,用户看到表单上的文件上传按钮,该表单被发布到我的php脚本中,然后我的php脚本需要将其重新发布到另一个脚本(例如,在另一个服务器上)。 我有此代码来接收文件并上传 代码: 我希望代码将文件发送到接收者文件。 问题答案: 采用: