3

这是我所说的幻数的链接: file magic

如何使用 JavaScript 远程读取文件的前几个字节(幻数)以确定它是否是图像文件?

4

3 回答 3

6

JavaScript 主要是一种客户端语言,因此您不能简单地以编程方式从您自己的页面读取托管在其他站点上的文件。XMLHttpRequest将让您检索远程数据,但这将检索整个文件,而不是前几个字节。做任何更花哨的事情都需要服务器端助手,例如 PHP 脚本或类似的。

您还应该知道,某些 HTTP 服务器无论如何都不允许您从输出中检索一定范围的字节——它们总是会返回整个文件。因此,即使使用 curl 或 wget 的 PHP 脚本,您也可能无法使其适用于所有远程站点:

是否可以使用 Linux 命令从 HTTP 服务器仅读取前 N 个字节?

(上面涵盖了命令行 curl,但结论是广泛适用的。)

编辑:Sergiu 指出将Range标头添加到 anXMLHttpRequest将起作用,至少对于某些服务器(范围标头对于 HTTP 1.1 是可选的)。但是,跨域图像检索仍需要进一步的支持,例如 CORS。

于 2012-08-14T23:53:59.923 回答
1

SO还有其他类似的问题。喜欢这个
它可能会帮助您将图像读取为二进制数据。

您将需要读取整个图像,而不仅仅是前几个字节。这是 JavaScript 的限制。

于 2012-08-14T23:58:16.033 回答
1

您可以为此使用 XMLHttpRequest:

  • 使用Range请求标头指定您只需要几个字节
  • 如果浏览器支持跨域请求,那么您甚至可以请求在其他站点上找到的图像,否则您只能使用您的服务器
  • 如果浏览器足够新,您甚至可以将响应作为ArrayBuffer访问,以将单个字节作为字节访问,而不是作为字符访问

这对我有用:

var request = new XMLHttpRequest();
request.open('GET', '/download/logo.png');
request.setRequestHeader('Range', 'bytes=0-5');
request.responseType = 'arraybuffer'
request.addEventListener('load', function() {
  console.log(new Uint8Array(request.response));
});
request.send();
于 2012-08-15T00:23:23.943 回答