Django rest框架大文件上传

标签 django django-rest-framework large-files django-file-upload large-file-upload

有没有一种简单的方法可以将大文件从客户端上传到 django rest 框架端点。在我的应用程序中,用户将上传非常大的文件 (>4gb)。浏览器有上传限制,这是图表。
enter image description here
我目前的想法是从客户端分 block 上传文件并从其余端点接收 block 。但我将如何做到这一点?我看到了一些库,例如 - resumable.js、tus.js、flow.js 等。但是我将如何处理后端的 block ?是否有针对此类问题积极维护的库?请帮我。

最佳答案

也许这个模块可以帮助:https://github.com/jkeifer/drf-chunked-upload .
该模块在链接中用于示例 django 应用程序,并带有示例代码用于实现。这是模块提供的典型用例,为简单起见,没有示例代码(如果需要,代码在链接中):

  • 初始 PUT 请求将发送到与文件的第一个 block 链接到 ChunkedUploadView(或任何子类)的 url。可以在 View 中覆盖 block 文件的名称(类属性 field_name)。
  • 作为返回,服务器将响应上传的 url 和当前偏移量。

  • 3 重复地将后续 block 放入从服务器返回的 url。
  • 服务器将继续响应 url 和当前偏移量。
  • 最后,上传完成后,向返回的 url 发送一个请求。此请求必须包含整个文件的校验和(十六进制)。
  • 如果一切正常,服务器将响应状态码 200 和 get_response_data 方法中返回的数据(如果有)。
  • 如果您想将文件作为单个 block 上传,这也是可能的!只需将第一个请求设为 POST 并包含文件的校验和摘要。如果上传整个文件,则不需要包含 Content-Range header 。

  • 根据这些说明,服务器似乎通过接收到的 header ("Content-Range") 及其 url 跟踪 block 的偏移量来处理上传,将上传的 block 存储在 .part 文件中。然后它会这样响应:
       {
            'id': 'f64ebd67-83a3-45b6-8acd-c749ea1ed4cd'
            'url': 'https://your-host/<path_to_view>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd',
            'file': 'https://your-host/<path_to_file>/f64ebd67-83a3-45b6-8acd-c749ea1ed4cd.part',
            'filename': 'example.bin',
            'offset': 10000,
            `created_at`: '2021-05-18T17:12:50.318718Z',
            'status': 1,
            'completed_at': None,
            'user': 1
        }
    
    当根据收到的 header 确定上传完整文件时,.part 文件将合并到最终上传中。这还允许您在上传中断时恢复上传,因为现有的 .part 文件会一直存在,直到上传完成。

    关于Django rest框架大文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68448739/

    相关文章:

    c++ - 如何在 Windows 上eekg() 超过 4GB 的文件?

    python - Django 1.4 中的静态文件夹结构?

    Python Anywhere 对 MySQL 数据库的访问被拒绝

    Python Shell,记录命令以方便重新执行

    django - 在 Django Rest 框架中发布请求处理

    python - 将 Router 与 Django REST Framework 一起使用时,如何让 APIViews 和 ViewSets 显示在 API Root 上?

    Android:Sqlite 从大 Blob 中崩溃

    Django - 检测页面中提交了哪个表单

    python - Django Rest Framework ListField 和 DictField

    c - 为什么我的程序不能将大量 (>2GB) 保存到文件中?