如何将 fileInput 元素的结果下载为任何类型文件的文件?
How to download a result of a fileInput element as a file for any kind of file type?
目前我可以读取 fileInput 元素的 onChange 结果,作为 base64 字符串。
我想在页面上实现一个 link,以便不同的用户可以下载与生成的 base64 或 blob 相同的文件。
作为补充,文件类型未知。因为我想要支持任何文件类型。或者图片、MS office 和文本文件中的一些流行文件类型。
让我把我当前的代码放在下面。
//index.js
const fileInput="fileInput";
init();
function init(){
document.getElementById(fileInput).addEventListener('change', readFile);
document.getElementById(fileInput).addEventListener('click', (e) => {
e.target.value = '';
});
}
function readFile(){
var file = document.getElementById(fileInput).files[0];
readFile2(file);
function readFile2(file) {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload =async function () {
const myBlob=await (reader.result); //I assume this is a blob.
const fileToStr=myBlob.toString();
alert(fileToStr); //base64
const blobUrl = URL.createObjectURL(myBlob);//ERROR
/*
index.js:22 Uncaught (in promise) TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed.
at FileReader.reader.onload (index.js:22)
*/
var link = document.createElement("a"); // Or maybe get it from the current document
link.href = blobUrl;
link.download = "aDefaultFileName.txt";// I want any file type supported.
link.innerHTML = "Click here to download the file";
document.body.appendChild(link); // Or append it whereever you want
//console.log(fileToStr);
}}}
我不知道你为什么要这样做,但你可以直接在你的文件上使用 URL.createObjectURL()
。
文件对象实现与 blob 相同的接口。无需实际读取文件 link 到它。
要支持所有文件类型,编辑如下:
//reader.readAsDataURL(file);
reader.readAsBinaryString( file );
要从 blob 创建文件对象,请编辑如下:
const myBlob=await (reader.result); //I assume this is a blob.
const fileToStr=myBlob.toString();
//const blobUrl = URL.createObjectURL(myBlob);//ERROR
const file2=new File([fileToStr], "filename");
const blobUrl = URL.createObjectURL(file2);
目前我可以读取 fileInput 元素的 onChange 结果,作为 base64 字符串。
我想在页面上实现一个 link,以便不同的用户可以下载与生成的 base64 或 blob 相同的文件。
作为补充,文件类型未知。因为我想要支持任何文件类型。或者图片、MS office 和文本文件中的一些流行文件类型。
让我把我当前的代码放在下面。
//index.js
const fileInput="fileInput";
init();
function init(){
document.getElementById(fileInput).addEventListener('change', readFile);
document.getElementById(fileInput).addEventListener('click', (e) => {
e.target.value = '';
});
}
function readFile(){
var file = document.getElementById(fileInput).files[0];
readFile2(file);
function readFile2(file) {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload =async function () {
const myBlob=await (reader.result); //I assume this is a blob.
const fileToStr=myBlob.toString();
alert(fileToStr); //base64
const blobUrl = URL.createObjectURL(myBlob);//ERROR
/*
index.js:22 Uncaught (in promise) TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed.
at FileReader.reader.onload (index.js:22)
*/
var link = document.createElement("a"); // Or maybe get it from the current document
link.href = blobUrl;
link.download = "aDefaultFileName.txt";// I want any file type supported.
link.innerHTML = "Click here to download the file";
document.body.appendChild(link); // Or append it whereever you want
//console.log(fileToStr);
}}}
我不知道你为什么要这样做,但你可以直接在你的文件上使用 URL.createObjectURL()
。
文件对象实现与 blob 相同的接口。无需实际读取文件 link 到它。
要支持所有文件类型,编辑如下:
//reader.readAsDataURL(file);
reader.readAsBinaryString( file );
要从 blob 创建文件对象,请编辑如下:
const myBlob=await (reader.result); //I assume this is a blob.
const fileToStr=myBlob.toString();
//const blobUrl = URL.createObjectURL(myBlob);//ERROR
const file2=new File([fileToStr], "filename");
const blobUrl = URL.createObjectURL(file2);