JavaScript:我可以从文件上传输入读取EXIF数据吗?

yfwxisqw  于 2023-01-11  发布在  Java
关注(0)|答案(6)|浏览(144)

我有以下任务:

  • 提供<input type=file />
  • 当用户添加文件时:
  • 读取EXIF数据(特别是位置信息,如果可用)
  • 使用 AJAX 将文件和信息从EXIF发送到外部API

因此,我希望在将文件添加到input时使用JavaScript提取一些EXIF数据。
这可能吗?
我知道这个问题:Can I read Exif data of a picture in the client-side with js?,它指的是http://blog.nihilogic.dk/2008/05/reading-exif-data-with-javascript.html
但我的问题是(我认为?)略有不同-我希望在映像位于我的域之前提取EXIF数据,而此时它位于用户的本地文件系统中,如果您明白我的意思。我可以访问二进制数据,那么我也可以获得EXIF吗?
谢谢你的建议。

cygmwpex

cygmwpex1#

你可以在HTML5的客户端上这样做。你应该有一个适当的基于服务器的回退,为旧的浏览器,不支持文件和FileReader。
你可以编写自己的exif解析器,或者使用jsjpegmeta library(Ben Leslie),这是一个简单而又令人敬畏的库,可以让浏览器从大多数jpeg文件中提取EXIF数据。有a patch说它修复了大多数兼容性问题。我还没有测试这个补丁,但是准备好分叉这个项目,戴上你的github帽子。

要获取EXIF:

1.**打开文件对话框:**我通常创建一个按钮,用于调用函数来生成<file输入并添加更改处理程序
1.**获取文件:**在文件更改处理程序ue $(this).get(0).files中获取所选文件的列表。
1.**解析exif数据:**将浏览结果发送到jsjpegmeta
我不得不稍微调整库以使它做我想做的事情(我想要一个commonJS库)我也做了在问题1中确定的调整。
Here is a fiddle

更新日期26.07.2022该软件包已移至Gitlab。补丁包含在最新版本中。您可以找到软件包here

qv7cva1a

qv7cva1a2#

我知道这个问题可能已经解决了,但我想提供一个替代的解决方案,为人们绊倒在这个问题上。
现在有一个新的库exifr,你可以用它来做这件事,它是一个经过维护的、积极开发的库,专注于性能,在nodejs和浏览器中都能工作。
从一个文件中提取exif的简单示例:

document.querySelector('#filepicker').addEventListener('change', async e => {
  let file = e.target.files[0]
  let exifData = await exif.parse(file)
  console.log('exifData', exifData)
})

从多个文件中提取exif的复杂示例:

document.querySelector('#filepicker').addEventListener('change', async e => {
    let files = Array.from(e.target.files)
    let promises = files.map(exif.parse)
    let exifs = await Promise.all(promises)
    let dates = exifs.map(exif => exif.DateTimeOriginal.toGMTString())
    console.log(`${files.length} photos taken on:`, dates)
})

你甚至可以提取嵌入在文件中的缩略图:

let img = document.querySelector("#thumb")
document.querySelector('input[type="file"]').addEventListener('change', async e => {
  let file = e.target.files[0]
  img.src = await exifr.thumbnailUrl(file)
})

您还可以试用库的playground并试验图像及其输出,或者查看repository and docs

zbwhf8kr

zbwhf8kr3#

是与现代浏览器,你可以读取文件内容,所以提取exif.你显示的链接是一个例子.问题是,在旧的浏览器IE6-9,FF 3.6-这是不可能的.你也应该考虑到这是一个艰难的过程,浏览器读取和提取exif从大文件.

ozxc1zmp

ozxc1zmp4#

我刚从npm找到了exif-js。
https://github.com/exif-js/exif-js
我在react里这么做。这是我的代码。它对我来说非常有效

import EXIF from 'exif-js';

//......

const fileChangedHandler = (event) => {
    const files = event.target.files;
    console.log(files[0]);
    EXIF.getData(files[0], function () {
        console.log(EXIF.getAllTags(this));
    });
};

//......

<input
    type="file"
    onChange={fileChangedHandler}
/>

结果应该是这样的。

rkttyhzu

rkttyhzu5#

Shanimal's answer是正确的,但是它使事情过于复杂。如果你不需要支持多个文件上传,下面是jsjpegmeta库的一个实现,它可以完成同样的事情:

<input type="file" accept="image/jpeg" id="input" />
<script src="./jsjpegmeta.js"></script>
<script>
document.getElementById('input').onchange = function(e) {
  var file = e.target.files[0],
    fr = new FileReader();
  fr.onloadend = function() {
    console.log(new JpegMeta.JpegFile(this.result, file.name));
  };
  fr.readAsBinaryString(file);
};
</script>
ssm49v7z

ssm49v7z6#

不,JavaScript不能直接到达EXIF;这不是一个安全问题,只是浏览器无法将其提供给DOM。
最接近你得到的正是另一个问题提到的黑客:在服务器端有一个进程来分析图像并通过 AJAX 〉返回EXIF数据。

相关问题