Node.js 我如何让我的Express应用程序在上传时尊重EXIF数据?

Node.js 我如何让我的Express应用程序在上传时尊重EXIF数据?,node.js,express,image-processing,Node.js,Express,Image Processing,我有一个Express应用程序,用于将图像上传到S3存储桶。我没有做任何特别的事情,只是直接上传,但当它们显示在浏览器中时,一些iPhone图像是横向的 我知道这在技术上是一个浏览器错误,Firefox现在支持这一规则,但Chrome仍然会在浏览器一侧显示图像 有没有办法让Express读取EXIF数据,并在上传之前旋转它们?是的,我找到了。我使用了和API的组合 首先,我使用Load Image从exif数据获取图像的方向并旋转它。然后,我将转换Load Image提供的画布输出,并将其转换为

我有一个Express应用程序,用于将图像上传到S3存储桶。我没有做任何特别的事情,只是直接上传,但当它们显示在浏览器中时,一些iPhone图像是横向的

我知道这在技术上是一个浏览器错误,Firefox现在支持这一规则,但Chrome仍然会在浏览器一侧显示图像


有没有办法让Express读取EXIF数据,并在上传之前旋转它们?

是的,我找到了。我使用了和API的组合

首先,我使用Load Image从exif数据获取图像的方向并旋转它。然后,我将转换Load Image提供的画布输出,并将其转换为blob(您可能还需要iOS的
.toBlob()
,因为它还不支持此功能)

然后将该blob附加到
FormData
对象,我还将其放回DOM中进行文件预览

// We need a new FormData object for submission.
var formData = new FormData();

// Load the image.
loadImage.parseMetaData(event.target.files[0], function (data) {
  var options = {};

  // Get the orientation of the image.
  if (data.exif) {
    options.orientation = data.exif.get('Orientation');
  }

  // Load the image.
  loadImage(event.target.files[0], function(canvas) {
    canvas.toBlob(function(blob) {
      // Set the blob to the image form data.
      formData.append('image', blob, 'thanksapple.jpg');
      // Read it out and stop loading.
      reader.readAsDataURL(blob);

      event.target.labels[0].innerHTML = labelContent;
    }, 'image/jpeg');
  }, options);

  reader.onload = function(loadEvent) {
    // Show a little image preview.
    $(IMAGE_PREVIEW).attr('src', loadEvent.target.result).fadeIn();
    // Now deal with the form submission.
    $(event.target.form).submit(function(event) {
      // Do it over ajax.
      uploadImage(event, formData);
      return false;
    });
  };
});
现在,我使用jQuery的AJAX方法实现
uploadImage
函数。注意
processData
contentType
标志,它们很重要

function uploadImage(event, formData) {
  var form = event.target;

  $.ajax({
    url: form.action,
    method: form.method,
    processData: false,
    contentType: false,
    data: formData
  }).done(function(response) {
    // And we're done!
  });

  // Remove the event listener.
  $(event.target).off('submit');
}
所有的信息都在那里,但它分布在多个资源中,希望这将节省人们大量的时间和猜测