【问题标题】:How do I convert a png to a base64 string using javascript?如何使用 javascript 将 png 转换为 base64 字符串?
【发布时间】:2015-02-04 06:27:54
【问题描述】:

我尝试了几种不同的选择,其中很多我都忘记了。我正在发出 AJAX 请求,响应为Content-Type: image/png,内容为实际图像。

我非常希望显示图像,但似乎没有什么能按我想要的方式工作:

// imgdata contains a string that looks like this: "�PNG..."
var img = document.createElement('img');

// no good
img.src = 'data:image/png;base64,' + btoa(unescape(encodeURIComponent(data)));

// also no good
img.src = 'data:image/png;base64,' + btoa(encodeURIComponent(data));

// also no good
img.src = 'data:image/png;base64,' + btoa($.map(d, function(x){ return x.charCodeAt(0); }))

我尝试了其他一些方法,但仍然没有骰子。

在 Javascript 中是否有任何简单(甚至复杂)的方法可以做到这一点?

【问题讨论】:

标签: javascript base64


【解决方案1】:

这不是用base64 而是用blob 完成的,但你会得到完全相同的结果:

var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if (this.readyState == 4 && this.status == 200){
            var img = document.getElementById('image');
            var url = window.URL || window.webkitURL;
            img.src = url.createObjectURL(this.response);
        }
    }
    // Relative path because : 
    // No 'Access-Control-Allow-Origin' header is present...
    xhr.open('GET', '/img/logo.png');
    xhr.responseType = 'blob';
    xhr.send();

在这里演示:http://jsfiddle.net/sparkup/sp4cukee/

【讨论】:

    【解决方案2】:

    如果您通过 node.js 或 PHP 提供此文件,您始终可以将文件写入服务器端临时位置的磁盘,提供它,然后立即将其删除。

    var tempFile = 'path/to/file.jpg';
    
    // Write the file to disk
    fs.writeFile(tempFile, base64versionOfPhoto, function (err) {
        if (err) {
            res.header("Content-Type","application/json");
            return res.send(JSON.stringify(err));   
        } else {
            // Pipe the jpg to the user
            res.header("Content-Type","image/jpeg");
    
            var readStream = fs.createReadStream(tempFile);
            readStream.pipe(res, {end: false});
    
            readStream.on("end", function () {
                res.end();
    
                // Delete the file
                fs.unlink(tempFile, function (err) {
                    if (err) console.log(err);
                });
            });
        }
    });
    

    【讨论】:

    • note 不一定是 node.js 或 PHP,这些只是示例。我提供的代码是 node.js btw
    • 嗯。这可能是一种解决方法。我正在使用 Java,呃,或者我只是在服务器端进行转换
    • 我在尝试显示来自 LDAP 服务器的照片时遇到了这个问题,该服务器采用 base64 格式。经过像您这样的多次尝试,我发现最好的方法是让服务器“创建”文件足够长的时间,以便将其提供给客户端。您绝对应该能够从 Java 中做类似的事情。
    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多