【问题标题】:How to get the source of an image from upload form?如何从上传表单中获取图片的来源?
【发布时间】:2013-08-31 12:39:18
【问题描述】:

我的第一个大型项目之一,所以请多多包涵。我有一个脚本可以帮助我调整图像大小并将其转换为 base64。这就是它的开始:

var createImage = function (src) {
    var deferred = $.Deferred();
    var img = new Image();

    img.onload = function() {
        deferred.resolve(img);
    };
    img.src = src;
    return deferred.promise();
};

而我的问题是从上传表单获取图片源到脚本?

我尝试将一个函数与 Filereader API 拼接在一起(在其他来源的帮助下):

var createImageURL = function () {
    var fileinput = document.getElementById('fileinput');
    file = fileinput.files[0];
    var reader = new FileReader();
    reader.readAsArrayBuffer(file);

    reader.onload = function (event) {
      var blob = new Blob([event.target.result]); 
      window.URL = window.URL || window.webkitURL;

      var blobURL = window.URL.createObjectURL(blob);

    }
    return blobURL;
};

但是,这会在控制台中返回 GET 错误。

【问题讨论】:

  • readAsArrayBuffer 是异步/非阻塞的,var blobURL 与您的return 在不同的范围内,return blobURL 将在文件读取完成之前发生。

标签: javascript html filereader


【解决方案1】:

与其通过Blob,不如直接将<input>File转换为ObjectURL,省去很多麻烦保持代码同步并减少代码行数。

function inputToURL(inputElement) {
    var file = inputElement.files[0];
    return window.URL.createObjectURL(file);
}

var url = inputToURL(document.getElementById('fileinput'));
createImage(url);

这是因为 File 是一个 Blob per spec(正如 Ray Nicholus 所指出的那样)


不建议(因为 File 已经从 Blob 继承)并且想要在它们之间进行转换非常不寻常,但并非不可能。我将其包括在内,以便您可以了解如何构建 FileReader 代码,如果您将来需要它,而不是作为解决问题的方法。要将<input type="file" /> 的第一个文件转换为Blob,您可以这样做

function fileToBlob(inputElement, callback) {
    var fileReader = new FileReader();
    fileReader.onload = function () {
        callback(new Blob([this.result]));
    }
    fileReader.readAsArrayBuffer(inputElement.files[0]);
}

callbackBlob 作为第一个参数。请记住,由于 readAsArrayBuffer 导致我们使用 callback,因此我们必须编写它以便它可以在异步环境中工作。

【讨论】:

  • 谢谢,我怀疑这太复杂了!
  • @SatoBolin 我几乎忘记了 FileBlob 在我最初输入答案时的工作方式几乎相同,但我发布的代码是写的现在可以工作了(我刚刚测试过)。
  • 这完全没有必要。文件也已经是 Blob。只需在 File 对象上调用 createObjectURL。看看the spec
  • 是的。为此使用 FileReader 不是可接受的解决方案。我建议您调整您的代码以仅包含正确的解决方案(如我在评论中所述)并解释为什么这一行解决方案是正确的,而不是对迂回和无效的解决方案进行调整,然后描述为什么这不是最好的方法来做到这一点。
  • @PaulS。它有效 :) 也许我对这些事情感到情绪化是愚蠢的,但我已经尝试了几个脚本,这是第一个在 iOS 上的 Safari 中工作的脚本,所以我真的很高兴!
猜你喜欢
  • 2020-02-20
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多