How to be able to convert image to base64 and avoid same-origin Policy

前端 未结 3 1679
悲&欢浪女
悲&欢浪女 2021-01-12 18:57

I\'m trying to convert an image (link) to base64 to be able to store in the Browser side (IndexedDB), but i\'m not able to do that, I have been looking for a solution for da

相关标签:
3条回答
  • 2021-01-12 19:12

    You need to download the image to a byte array first: Downloading binary data using XMLHttpRequest, without overrideMimeType

    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://www.celticfc.net/images/doc/celticcrest.png', true);
    
    xhr.responseType = 'arraybuffer';
    
    xhr.onload = function(e) {
       if (this.status == 200) {
           var uInt8Array = new Uint8Array(this.response); // Note:not xhr.responseText
    
           for (var i = 0, len = uInt8Array.length; i < len; ++i) {
               uInt8Array[i] = this.response[i];
           }
    
           var byte3 = uInt8Array[4]; // byte at offset 4
       }
    }
    
    xhr.send();
    

    Then you can use the byte array as follows: Javascript : How to display image from byte array using Javascript or Servlet?

    <img id="ItemPreview" src="" />
    
    document.getElementById("ItemPreview").src = "data:image/png;base64," + YourByteArray;
    

    EDIT: I cannot try this ATM but you can alternatively save the file to the file system using the HTML5 FileSystem API: How to save a image to HTML5 filesystem with the url of image

    window.requestFileSystem(window.PERSISTENT, 2*1024*1024, onFileSystemSuccess, fail);
    
    
    function onFileSystemSuccess(fileSystem) {
        fs = fileSystem;
        console.log('File system initialized');
    
        saveAsset('http://www.example-site-with-cors.com/test.png');
    }
    
    
    function saveAsset(url, callback, failCallback) {
        var filename = url.substring(url.lastIndexOf('/')+1);
    
        // Set callback when not defined
        if (!callback) {
            callback = function(cached_url) {
                console.log('download ok: ' + cached_url);
            };
        }
        if (!failCallback) {
            failCallback = function() {
                console.log('download failed');
            };
        }
    
        // Set lookupTable if not defined
        if (!window.lookupTable)
            window.lookupTable = {};
    
        // BlobBuilder shim
        // var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
    
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        // xhr.responseType = 'blob';
        xhr.responseType = 'arraybuffer';
    
        xhr.addEventListener('load', function() {
    
            fs.root.getFile(filename, {create: true, exclusive: false}, function(fileEntry) {
                fileEntry.createWriter(function(writer) {
    
                    writer.onwrite = function(e) {
                        // Save this file in the path to URL lookup table.
                        lookupTable[filename] = fileEntry.toURL();
                        callback(fileEntry.toURL());
                    };
    
                    writer.onerror = failCallback;
    
                    // var bb = new BlobBuilder();
                    var blob = new Blob([xhr.response], {type: ''});
                    // bb.append(xhr.response);
                    writer.write(blob);
                    // writer.write(bb.getBlob());
    
                }, failCallback);
            }, failCallback);
        });
    
        xhr.addEventListener('error', failCallback);
        xhr.send();
    
        return filename;
    }
    
    
    
    function fail(evt) {
        console.log(evt.target.error.code);
    }
    
    0 讨论(0)
  • 2021-01-12 19:13

    While converting into base64 you can use a proxy URL (https://cors-anywhere.herokuapp.com/) before your image path to avoid cross-origin issue

    var getDataUri = function (targetUrl, callback) {
        var xhr = new XMLHttpRequest();
        xhr.onload = function () {
            var reader = new FileReader();
            reader.onloadend = function () {
                callback(reader.result);
            };
            reader.readAsDataURL(xhr.response);
        };
        var proxyUrl = 'https://cors-anywhere.herokuapp.com/';
        xhr.open('GET', proxyUrl + targetUrl);
        xhr.responseType = 'blob';
        xhr.send();
    };
    getDataUri(path, function (base64) {
        // base64 availlable here
    })
    
    0 讨论(0)
  • 2021-01-12 19:31

    for same origin policy you must add headers for server side from where you want your images

    here is how to do this - http://enable-cors.org/server.html

    for development purpose you can install 'CORS' extension in CHROME browser to allow cross origin request

    hope this helps and solve your issue.

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