reactjs - 如何使用 React js 处理非常大的文件下载

标签 reactjs large-files

我们正在尝试下载大文件,例如 1GB 或 2GB,但在一段时间后,尽管后端仍然在 UI 上显示错误,因为无法获取大文件。

那么我们如何使用React js处理大文件下载

请帮忙!

代码如下:

getFile = async (endpoint: string, id: string, params?: any) => {
  const response = await fetch(
    this.createUrl(endpoint + "/" + id, params),
    this.getRequest("get", {
      Accept: "application/octet-stream",
      "Content-Type": "application/octet-stream",
    }),
  );
  if (response.status === 200) {
    return await response.blob();
  } else {
    throw Error(errorObj.error);
  }
};

downloadFile = (filepath: any) => {
  this.props.api.getFile(resource, filepath, {}).then((res: any) =>
    this.setState(() => {
      const url = window.URL.createObjectURL(new Blob([res]));
      const link = document.createElement("a");
      link.href = url;
      link.setAttribute("download", path.basename(filepath));
      document.body.appendChild(link);
      link.click();
      link.parentNode!.removeChild(link);
      toaster.success("Successfully downloaded ");
    }),
  );
};

最佳答案

使用 fetch 会将响应缓冲到内存中,并且您不能期望在内存中缓冲 1 到 2 GB。 (您可以使用 IndexedDB 做一些聪明的事情,例如 Mega 所做的,但这可能不值得。)

无需从 URL(我们称之为 URL A)中获取数据并从内容 Blob 创建对象 URL 以放入您单击的下载链接,只需将 URL A 放入下载链接。

如果 URL A 处的端点需要某种身份验证或类似身份验证,您将需要将其更改为可以编码到查询参数中的内容;可能是带有类似于 AWS S3 对预签名 URL 所做的签名的 token 。

关于reactjs - 如何使用 React js 处理非常大的文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64333365/

相关文章:

python - 增加 Tornado 中 BaseIOStream 的 max_buffer_size 限制

reactjs - 如何在React TypeScript应用程序中重置从RTK查询中的钩子(Hook)返回的 `data` `isLoading`和 `error`的值?

node.js - npm 启动 webpack 问题?

javascript - redux-thunk 的唯一好处是什么?

java - 尝试覆盖文件中间的数据而不影响文件的开头

c++ - 在 C++ 中将大文本文件读取到内存

perl - 如何快速解析大(> 10GB)文件?

reactjs - React 中的配置文件

javascript - React pdf-renderer 不显示字符 č、ć 和 đ

c# - 多线程读取和处理大文本文件