【问题标题】:Django rest framework large file uploadDjango rest框架大文件上传
【发布时间】:2021-09-27 14:29:37
【问题描述】:

有没有一种简单的方法可以将大文件从客户端上传到 django rest 框架端点。在我的应用程序中,用户将上传非常大的文件 (>4gb)。浏览器有上传限制,这是图表。

我目前的想法是从客户端以块的形式上传文件并从其余端点接收块。但我将如何做到这一点?我看到了一些库,比如 resumable.js、tus.js、flow.js 等。但是我将如何处理后端的块?是否有针对此类问题积极维护的库?请帮帮我。

【问题讨论】:

  • 我推荐使用 sftp 服务器。我假设您的应用程序同步运行。如果您使用该数据量请求 django,您将阻止所有其他传入请求,直到文件被上传,甚至作为块上传。
  • @KlimBim 我的应用是异步的。 React 作为前端,django 作为后端。对于这种情况,sftp-server 不是一个很好的选择。我在 django 中看到了一些 tusjs 服务器的实现,但是——它的 repo 已经很老了。它有很多问题,因为它是在 6 年前实施的。 tus协议的文档也不是很好。

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


【解决方案1】:

https://stackoverflow.com/a/26278960/12776116

也许这可以帮助你。正如您所提到的,文件是通过将其分成小部分来上传的。

【讨论】:

【解决方案2】:

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

  1. 初始 PUT 请求将发送到与文件的第一个块链接到 ChunkedUploadView(或任何子类)的 url。可以在视图中覆盖chunk文件的名称(类属性field_name)。

  2. 作为回报,服务器将响应上传的 url 和当前的偏移量。

3 重复PUT后续块到服务器返回的url。

  1. 服务器将继续响应 url 和当前偏移量。

  2. 最后,上传完成后,向返回的 url 发送一个请求。此请求必须包含整个文件的校验和(十六进制)。

  3. 如果一切正常,服务器将响应状态码 200 和 get_response_data 方法中返回的数据(如果有)。

  4. 如果您想将文件作为单个块上传,这也是可能的!只需将第一个请求设为 POST 并包含文件的校验和摘要。如果上传整个文件,则不需要包含 Content-Range 标头。

根据这些说明,服务器似乎通过接收到的标头 ("Content-Range") 及其 url 跟踪块的偏移量来处理上传,将上传的块存储在 .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
    }

根据接收到的标头确定上传完整文件后,.part 文件将合并到最终上传中。这也允许您在上传被中断时恢复上传,因为现有的 .part 文件会一直保留到上传完成。

【讨论】:

  • 有没有为此构建的 JS 客户端?还是我们应该自己实现?
  • 不,我不这么认为。需要使用JS客户端吗?
  • 我正在使用反应。如果已经为此构建了一个 JS 客户端,那就太棒了。这会让我的工作轻松很多。
  • 这个特定的包没有专门为它构建的,但是有很多在线教程供你编写自己的,例如(section.io/engineering-education/…valentinog.com/blog/drf),您可以查看以轻松将 drf 与 react 集成。结合上面的答案,你应该很高兴。
【解决方案3】:

你应该用 celery 任务来做。

看看这个link。它解释了如何使用 django 和 celery 上传文件。

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 2013-12-26
    • 2016-10-25
    • 2016-02-16
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多