I have a code snippet here that lets me validate the image upload as well as preview it:
const validateAndPreview = (event) => {
if(event.target.files.length < 1){
return;
}
const file = event.target.files[0]
const validExtensions = ["png", "jpg", "jpeg"];
const fileExtension = file.type.split("/")[1]
if(validExtensions.includes(fileExtension)){
setError({ error: false, message: "" });
let fileReader = new FileReader();
fileReader.onload = (e) => {
setImagePreview(e.target.result);
}
fileReader.readAsDataURL(file)
}else{
setError({ error: true, message: "File extension is invalid" });
setImagePreview("");
}
}
Do I need to release the fileReader
object and remove the load event handler to avoid memory leaks or all of this is being done automatically with fileReader?
I assumed that it might be the way to go, but I'm not sure if it makes sense.
fileReader.onload = (e) => {
setImagePreview(e.target.result);
reader.onload = null;
reader = null;
}
(edited) Implementation with createObjectURL
const validateAndPreview = (event) => {
if(event.target.files.length < 1){
return;
}
const file = event.target.files[0]
const validExtensions = ["png", "jpg", "jpeg"];
const fileExtension = file.type.split("/")[1]
if(validExtensions.includes(fileExtension)){
setError({ error: false, message: "" });
const fileURL = URL.createObjectURL(file);
setImagePreview(fileURL);
}else{
setError({ error: true, message: "File extension is invalid" });
setImagePreview("");
}
}
useEffect(() => {
return () => {
if (imagePreview) {
console.log("UNMOUNT")
console.log(imagePreview)
URL.revokeObjectURL(imagePreview);
console.log("AFTER:", imagePreview)
}
};
}, [imagePreview])