如何从上传表单中获取图像的来源?

时间:2013-08-31 12:39:18

标签: javascript html5 filereader

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

1 个答案:

答案 0 :(得分:5)

而不是通过 Blob ,直接将您的<input> 文件转换为 ObjectURL ,从而节省自己的费用通过保持代码同步并减少代码行数来节省很多麻烦。

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

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

这是有效的,因为文件 Blob per spec(由Ray Nicholus指出)


不建议(因为文件已经从 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]);
}

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