如何使用JavaScript上传嵌入的图像?

and*_*nas 16 javascript upload image

我想构建一个包含JavaScript的简单HTML页面来执行表单POST,其中包含嵌入在HTML中的图像数据与磁盘上的文件.

我看过这篇文章可以使用常规表单数据,但我对图像数据感到困惑.

JavaScript发布请求,如表单提交

Joe*_*der 26

**更新**2014年2月**

新的和改进的版本作为jQuery插件提供:https: //github.com/CoeJoder/jquery.image.blob

用法:

$('img').imageBlob().ajax('/upload', {
    complete: function(jqXHR, textStatus) { console.log(textStatus); } 
});
Run Code Online (Sandbox Code Playgroud)



要求

因此浏览器要求是:

  • Chrome:20+
  • Firefox:13+
  • Internet Explorer:10+
  • 歌剧:12.5+
  • Safari:6+

注意:图像必须 JavaScript 相同,否则浏览器安全策略将阻止调用canvas.toDataURL()(有关更多详细信息,请参阅此SO问题:为什么canvas.toDataURL()会引发安全性异常?).代理服务器可用于通过响应头注入来规避此限制,如该帖子的答案中所述.

这是以下代码的jsfiddle.它应该抛出一条错误消息,因为它没有提交到真正的URL('/ some/url').使用firebug或类似工具检查请求数据并验证图像是否已序列化为表单数据(在页面加载后单击"运行"):

发布数据

示例标记

<img id="someImage" src="../img/logo.png"/>
Run Code Online (Sandbox Code Playgroud)

JavaScript

(function() {
    // access the raw image data
    var img = document.getElementById('someImage');
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = img.width;
    canvas.height = img.height;
    ctx.drawImage(img, 0, 0);
    var dataUrl = canvas.toDataURL('image/png');
    var blob = dataUriToBlob(dataUrl);

    // submit as a multipart form, along with any other data
    var form = new FormData();
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/some/url', true);    // plug-in desired URL
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                alert('Success: ' + xhr.responseText);
            } else {
                alert('Error submitting image: ' + xhr.status);
            }
        }
    };
    form.append('param1', 'value1');
    form.append('param2', 'value2');
    form.append('theFile', blob);
    xhr.send(form);

    function dataUriToBlob(dataURI) {
        // serialize the base64/URLEncoded data
        var byteString;
        if (dataURI.split(',')[0].indexOf('base64') >= 0) {
            byteString = atob(dataURI.split(',')[1]);
        }
        else {
            byteString = unescape(dataURI.split(',')[1]);
        }

        // parse the mime type
        var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

        // construct a Blob of the image data
        var array = [];
        for(var i = 0; i < byteString.length; i++) {
            array.push(byteString.charCodeAt(i));
        }
        return new Blob(
            [new Uint8Array(array)],
            {type: mimeString}
        );
    }
})();
Run Code Online (Sandbox Code Playgroud)

参考

SO:'将DataURI转换为File并附加到FormData