How can I upload an embedded image with JavaScript?

前端 未结 2 489
萌比男神i
萌比男神i 2020-12-08 16:35

I\'d like to build a simple HTML page that includes JavaScript to perform a form POST with image data that is embedded in the HTML vs a file off disk.

I\'ve looked

相关标签:
2条回答
  • 2020-12-08 17:24

    Assuming that you are talking about embedded image data like http://en.wikipedia.org/wiki/Data_URI_scheme#HTML

    ****If my assumption is incorrect, please ignore this answer.**

    You can send it as JSON using XMLHttpRequest. Here is sample code: (you may want to remove the header part ('data:image/png;base64,') before sending)

    Image

    <img id="myimg" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
    AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
    9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
    

    Button

    <input id="subbtn" type="button" value="sub" onclick="sendImg()"></input>
    

    Script

    function sendImg() {
        var dt = document.getElementById("myimg").src;
        var xhr = new XMLHttpRequest();
        xhr.open("POST", '/Home/Index', true); //put your URL instead of '/Home/Index'
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) { //4 means request finished and response is ready
                alert(xhr.responseText);
            }
        };
        var contentType = "application/json";
        xhr.setRequestHeader("Content-Type", contentType);
    
        for (var header in this.headers) {
            xhr.setRequestHeader(header, headers[header]);
        }
    
        // here's our data variable that we talked about earlier
        var data = JSON.stringify({ src: dt });
    
        // finally send the request as binary data
        xhr.send(data);
    }
    

    EDIT

    As @JoeCoder suggests, instead of json, you can also use a FormData object and send in Binary format. Check his answer for more details.

    0 讨论(0)
  • 2020-12-08 17:37

    ** UPDATE ** Feb. 2014 **

    New and improved version available as a jQuery plugin: https://github.com/CoeJoder/jquery.image.blob

    Usage:

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



    Requirements

    • the canvas element (HTML 5)
    • FormData
    • XMLHttpRequest.send(:FormData)
    • Blob constructor
    • Uint8Array
    • atob(), escape()

    Thus the browser requirements are:

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

    Note: The images must be of the same-origin as your JavaScript, or else the browser security policy will prevent calls to canvas.toDataURL() (for more details, see this SO question: Why does canvas.toDataURL() throw a security exception?). A proxy server can be used to circumvent this limitation via response header injection, as described in the answers to that post.

    Here is a jsfiddle of the below code. It should throw an error message, because it's not submitting to a real URL ('/some/url'). Use firebug or a similar tool to inspect the request data and verify that the image is serialized as form data (click "Run" after the page loads):

    POST data

    Example Markup

    <img id="someImage" src="../img/logo.png"/>
    

    The 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}
            );
        }
    })();
    

    References

    SO: 'Convert DataURI to File and append to FormData

    0 讨论(0)
提交回复
热议问题