使用jQuery.ajax()获取图像并将其解码为base64

use*_*987 21 ajax binary jquery base64 image

我想做的事:

使用来自基本身份验证的安全服务器的jQuery.ajax()来HTTP-GET图像(jpeg).看起来我得到了一些图像数据,它必须是二进制的.我想将其转换为base64,因为那时我可以这样在我的html中插入这个图像:

     $("#image").attr('src', 'data:image/jpeg;base64,' + base64encode(data));
Run Code Online (Sandbox Code Playgroud)

ajax调用看起来像这样:

            $.ajax({
                url: "someurltoajpeg",
                type: "GET",
                headers: {
                    "Authorization" : "Basic " +  btoa("user:pw")
                },
                xhrFields: {
                    withCredentials: true
                }
            }).done(function( data, textStatus, jqXHR ) {
                $("#image").attr('src', 'data:image/jpeg;base64,' + base64encode(data));
            }).fail(function( jqXHR, textStatus, errorThrown ) {
                alert("fail: " + errorThrown);
            });
Run Code Online (Sandbox Code Playgroud)

函数base64encode看起来像这样:

        function base64encode(binary) {
            return btoa(unescape(encodeURIComponent(binary)));
        }
Run Code Online (Sandbox Code Playgroud)

我从这里得到了这个功能: 使用Javascript检索二进制文件内容,base64对其进行编码并使用Python对其进行反向解码

他说那对他有用.但在我的情况下,我的图像的src属性被更改,并且插入了一些非常长的数据,但只有那个图像应该出现的非常小的符号.我可以保存那个"图像",甚至不存在,当我打开它时,我的图像查看器说,它不是一个jpeg文件.这不是由特定图像或相同的原始策略引起的错误.有谁解决这个问题?谢谢

gae*_*noM 28

首先,根据使用Javascript检索二进制文件内容,base64对其进行编码并使用Python对其进行反向解码,将正确的mimetype添加到Ajax调用:

 $.ajax({
            url: "someurltoajpeg",
            type: "GET",
            headers: {
                "Authorization" : "Basic " +  btoa("user:pw")
            },
            xhrFields: {
                withCredentials: true
            },
            mimeType: "text/plain; charset=x-user-defined"
        }).done(function( data, textStatus, jqXHR ) {
            $("#image").attr('src', 'data:image/jpeg;base64,' + base64encode(data));
        }).fail(function( jqXHR, textStatus, errorThrown ) {
            alert("fail: " + errorThrown);
        });
Run Code Online (Sandbox Code Playgroud)

然后使用base64Encode函数而不是btoa:

function base64Encode(str) {
        var CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        var out = "", i = 0, len = str.length, c1, c2, c3;
        while (i < len) {
            c1 = str.charCodeAt(i++) & 0xff;
            if (i == len) {
                out += CHARS.charAt(c1 >> 2);
                out += CHARS.charAt((c1 & 0x3) << 4);
                out += "==";
                break;
            }
            c2 = str.charCodeAt(i++);
            if (i == len) {
                out += CHARS.charAt(c1 >> 2);
                out += CHARS.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
                out += CHARS.charAt((c2 & 0xF) << 2);
                out += "=";
                break;
            }
            c3 = str.charCodeAt(i++);
            out += CHARS.charAt(c1 >> 2);
            out += CHARS.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += CHARS.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
            out += CHARS.charAt(c3 & 0x3F);
        }
        return out;
    }
Run Code Online (Sandbox Code Playgroud)

再见