Skip to content

Instantly share code, notes, and snippets.

@hallojoe
Created January 14, 2021 09:16
Show Gist options
  • Save hallojoe/f2044e2435e6fdc5c9a1d8568b819713 to your computer and use it in GitHub Desktop.
Save hallojoe/f2044e2435e6fdc5c9a1d8568b819713 to your computer and use it in GitHub Desktop.
Read files with FileReader
export interface IFile {
name: string
size?: number
type?: string
lastModified?: number
data?: string|ArrayBuffer
}
export enum ReadFileReturnTypes {
Text = "text",
DataUrl = "dataUrl",
BinaryString = "binaryString",
ArrayBuffer = "arrayBuffer"
}
export const readFile = (file: File, returnType: ReadFileReturnTypes = ReadFileReturnTypes.DataUrl): Promise<IFile> => {
const reader = new FileReader()
return new Promise((resolve, reject) => {
reader.onload = (event:ProgressEvent<FileReader>) => {
const abstractFile = {
data: event.target.result,
name: file.name,
size: file.size,
type: file.type,
lastModified: file.lastModified
}
resolve(abstractFile)
}
reader.onerror = reject
switch(returnType) {
case ReadFileReturnTypes.DataUrl : reader.readAsDataURL(file)
break
case ReadFileReturnTypes.BinaryString : reader.readAsBinaryString(file)
break
case ReadFileReturnTypes.ArrayBuffer : reader.readAsArrayBuffer(file)
break
default : reader.readAsText(file)
}
})
}
export const readFilesAsync = async (files: FileList, returnType: ReadFileReturnTypes = ReadFileReturnTypes.DataUrl): Promise<IFile[]> =>
await Promise.all(Array.from(files).map(file => readFile(file, returnType)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment