如何将Base64文件转换为javascript中的实际文件/原始文件,并将其下载到客户端

时间:2015-02-03 07:15:00

标签: java javascript spring-mvc base64

对不起,如果我的问题有点令人困惑,但我认为可以通过我的详细解释澄清这一点。

我非常擅长保存/上传文件。我最近能够上传图片并将其作为base64(datatype = mediumblob)保存到数据库,并通过设置<img src='base64_data_from_db' />在浏览器中再次显示。

现在我的实际问题。

我必须将任何类型的文件上传到数据库。保存后,用户必须能够通过单击链接/按钮(我使用链接)使用浏览器下载文件。我可以使用base64保存文件。

我现在遇到的问题是如何将base64字符串转换为实际/原始文件(如MS Word,文本文件,图像等)并将其下载给用户。

我删除了base64字符串的前缀并使用了window.atob(str) 转换它。我console.log(window.atob(str))时可以看到文件的内容,但我不知道如何下载。

注意:我在保存时使用了base64,因为我使用JSON保存它。 我正在使用Java Spring Hibernate。 我试图谷歌,但大多数时候我看到how to convert Base64 to image ...正如我之前所说,我已经在<img src=''/>中显示了图像。我也在阅读有关javascript FileReader但它需要一个Blob作为参数,我所拥有的是一个base64字符串。

下面我的代码非常不完整,因为我不知道下一步该做什么......

// strBase64 -- The base64 string equivalent of the file 
function convBase64ToFile(strBase64) {
    var tmp = strBase64.split(","); // To remove the prefix
    var converted = window.atob(tmp[1]); //
    console.log(converted); // Displays the content of the actual file
}

请帮忙......

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题...... 我将base64字符串转换为Blob,然后使用URL.createObjectURL()获取网址,然后打开一个新窗口,将blob的网址设置为窗口的网址。

function convBase64ToFile(strBase64) {
    var tmp = strBase64.split(",");
    var prefix = tmp[0];
    var contentType = prefix.split(/[:;]+/)[1];
    var byteCharacters = atob(tmp[1]);

    var byteNumbers = new Array(byteCharacters.length);
    for (var i = 0; i < byteCharacters.length; i++) {
         byteNumbers[i] = byteCharacters.charCodeAt(i);
    }
    var byteArray = new Uint8Array(byteNumbers);
    var blob = new Blob([byteArray], {type: contentType});
    var blobUrl = URL.createObjectURL(blob);
    window.open(blobUrl, "popup","width=1000,height=500,scrollbars=1,resizable=no," +
    "toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0");
}