对不起,如果我的问题有点令人困惑,但我认为可以通过我的详细解释澄清这一点。
我非常擅长保存/上传文件。我最近能够上传图片并将其作为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
}
请帮忙......
答案 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");
}