【问题标题】:Django Rest Framework upload file and in response show the url without database refDjango Rest Framework 上传文件并作为响应显示没有数据库引用的 url
【发布时间】:2020-10-05 19:40:57
【问题描述】:

我正在尝试使用我的预期名称将文件直接上传到服务器,并尝试在不保存其 ref 数据库字段的情况下发送文件 url 作为响应。

这是我的看法:

class DocumentUploadView(APIView):
    parser_classes = [MultiPartParser]

    def post(self, request, format=None):
        file_obj = request.data['file']
        return Response(
            status=204
        )

我尝试使用邮递员上传,但我发现我的服务器媒体文件夹中没有保存任何数据。

在这种情况下有人可以帮助我吗?我不想将文件的 url 保存在数据库 imageField 或 FileField 中,我只想上传它以将其直接保存在服务器中,作为响应,它应该将 url 发送给我。

在这种情况下有人可以帮助我吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您将文件存储在内存中,而不是任何特定目录中。如果您真的想通过 API 提供文件而不需要任何数据库引用,则需要将其显式写入您的媒体文件夹,然后手动将该字段添加到您的响应对象中。这种方法可能会帮助您找到解决方案,请注意我自己没有测试过。

    from django.conf import settings
    import os
    
    
    class DocumentUploadView(APIView):
        parser_classes = [MultiPartParser]
    
        def post(self, request, format=None):
            file_obj = request.FILES['file']
            path = os.path.join(settings.MEDIA_ROOT, file_obj.name)
            with open(path, 'w') as infile:
                str_repr = file_obj.read().decode()  # Assuming text based file
                infile.write(str_repr)
            full_url = f'{request.schema}://{request.get_host()}/{path}'
            return Response({'file': full_url}, status=201)
    
    

    【讨论】:

    • 它会抛出这个错误:write() 参数必须是 str,而不是 InMemoryUploadedFile
    • 我更新了答案以展示如何将基于文本的文件转换为字符串。如果您需要处理不同的文件类型,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2018-03-29
    • 2021-06-01
    • 1970-01-01
    • 2018-02-16
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多