2

我的第一个大型项目之一,所以请多多包涵。我有一个脚本可以帮助我调整图像大小并将其转换为 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 错误。

4

1 回答 1

6

而不是通过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);

这是有效的,因为文件每个规范的Blob (正如 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]);
}

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

于 2013-08-31T13:19:09.940 回答