【问题标题】:How to Pick a FileReader Reading Method?如何选择 FileReader 读取方法?
【发布时间】:2019-03-14 20:06:52
【问题描述】:

在制作一个简单的图片上传器时,我正在学习 FileReader API。上传文件有4种格式,数组缓冲区、二进制字符串、数据URL和文本,我想知道如何选择。

在少数几篇文章中,this 表示,当你想显示上传的图片时数据 URL 很好,当你操作文件时数组缓冲区很好。你怎么看?而且,什么时候是选择二进制字符串或文本格式的好时机?

【问题讨论】:

  • 如果您想将文件作为文本读取,您可以使用 readAsText,例如CSV 或 JSON。
  • @RobG 嗨!你当然是对的!所以,当我上传图像文件时,它们没有用,你认为?
  • Kaiido 已经回答了这个问题,但简短的回答是肯定的。您不需要读取文件来上传它,但如果您只想接受某些类型而不是依赖扩展名,您可能需要检查文件的标题(仍然不是万无一失,但更难欺骗)。

标签: javascript image image-processing


【解决方案1】:

对于“文件上传器”,您根本不应该使用 FileReader。

您无需阅读文件即可上传,you can send it as a Blob directly

如果你需要在当前页面显示它,你仍然不需要一个 FileReader,create a blobURI from the Blob,它将直接指向磁盘上的文件,没有无用的内存膨胀。

inp.onchange = e => {
  // yes that's all synchronous...
  const url = URL.createObjectURL(inp.files[0]);
  const img = new Image();
  img.src = url;
  document.body.appendChild(img);
};
<input type="file" id="inp" accept="image/*">

FileReader 的唯一用例是当您需要访问文件的内容时,例如,

  • 如果您想加载文本文件(或 csv 或 json)并对其进行解析,那么您将使用 readAsText() 方法。
  • 如果您想读取/编辑一些二进制文件(例如读取 JPEG 文件的元数据?),那么您将使用 readAsArrayBuffer(),并从此缓冲区工作。
  • readAsDataURL() 不幸被滥用太多,如前所述,在 99% 的情况下,您将从这个 dataURI 执行的操作可以使用 blobURI 或直接使用 Blob 完成。我能看到的唯一一种情况是在某个独立文档中附加二进制数据......或者,不是每个网站每天都会发生的事情......
  • readAsBinaryString() 相当没用,甚至已从标准中删除。如果您确实需要文件的二进制字符串表示,您可以从 ArrayBuffer 生成一个,但您将如何处理此字符串是一个谜。 (直接使用 ArrayBuffer)。

【讨论】:

  • 感谢您的回复!所以,如果我想在客户端调整大小,我会用 readAsArrayBuffer() 上传一个图像文件,对吗?
  • @Heuyie 没有。除非你有用 js 编写的解码器和编码器。但通常我们所做的是将图像从 blobURI 加载到 img 元素中,在画布上绘制调整大小的图像,然后获取调整大小的画布的 Blob。
  • 另外,如果我允许其他人上传文件,我需要读取文件并验证其文件类型等以确保安全吗?
  • @Heuyie 这有点没用,坏人不会使用浏览器在您的服务器中注入坏东西。做检查服务器端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多