I have a function in java script that runs through the files.
I have selected by means of an input type:
file multiple, this function lists the files and for each file they add a link "See detail" which in turn when clicking sends to an onchange.
That link I create it when going through the selected files.
The problem is that in this function I need to obtain the balor in BASE64 per file, I only do that when I debug the script from the browser.
If I get Base64 per file but when I do not debugeo it leaves my variable indefinite.
I leave my code.
function handleFileSelect(e) {
console.dir(e);
if (!e.target.files) return;
selDiv.innerHTML = "";
var files = e.target.files;
for (var i = 0; i < files.length; i++) {
var base64;
var fileToLoad = document.getElementById("files").files[i]
var fileReader = new FileReader();
fileReader.onload = function (fileLoadedEvent) {
base64 = fileLoadedEvent.target.result;
console.log(base64);
};
fileReader.readAsDataURL(fileToLoad);
var f = files[i];
var TmpPath = URL.createObjectURL(e.target.files[i]);
var name = f.name;
var extencion = f.name.split('.')[1];
selDiv.innerHTML += f.name + " <a href='#' onclick=verdetalle(" + i + ",'" + extencion + "','" + name + "','" + base64 + "','" + TmpPath + "')>Ver Detalle</a>" + "<br/>";
}
}
this seccion the code is my problem, why?
var base64;
var fileToLoad = document.getElementById("files").files[i]
var fileReader = new FileReader();
fileReader.onload = function (fileLoadedEvent) {
base64 = fileLoadedEvent.target.result;
console.log(base64);
};
fileReader.readAsDataURL(fileToLoad);
FileReader works asynchronously. base64
is undefined
during for-loop.
You are using function-scope variables. It overwrites variables.
async function
type:
document.querySelector( "input" ).addEventListener( "change", handleFileAsync ); async function handleFileAsync ( event ) { async function readFile( file ) { let reader = new FileReader(); let result = new Promise( resolve => reader.addEventListener( "load", resolve ) ); reader.readAsArrayBuffer( file ); return { name: `name: ${file.name}`, ArrayBuffer: ( await result ).srcElement.result } } let files = event.srcElement.files; let promises = []; for ( const file of files ) { promises.push( readFile( file ) ); } console.log( await Promise.all( promises ) ); }
<input type="file" multiple>
Equivalent normal function as above:
document.querySelector( "input" ).addEventListener( "change", handleFile ); function handleFile ( event ) { let files = event.srcElement.files; let promises = []; for ( const file of files ) { let reader = new FileReader(); promises.push( new Promise( resolve => reader.addEventListener( "load", resolve ) ) .then( result => ( { name: `name: ${file.name}`, ArrayBuffer: result.srcElement.result } ) ) ); reader.readAsArrayBuffer( file ); } Promise.all( promises ).then( list => console.log( list ) ); }
<input type="file" multiple>
For using console, heading code uese .readAsArrayBuffer
instead of .readAsDataURL
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.