Support downloading files

This commit is contained in:
momo5502
2025-08-15 09:40:39 +02:00
parent 5bea61fc3b
commit 6584eaaff5
2 changed files with 38 additions and 0 deletions

View File

@@ -30,6 +30,7 @@ type ClickHandler = (element: FolderElement) => void;
type CreateFolderHandler = () => void;
type RemoveElementHandler = (element: FolderElement) => void;
type RenameElementHandler = (element: FolderElement) => void;
type DownloadElementHandler = (element: FolderElement) => void;
type AddFilesHandler = () => void;
type IconReader = (element: FolderElement) => string | null;
@@ -40,6 +41,7 @@ export interface FolderProps {
createFolderHandler: CreateFolderHandler;
removeElementHandler: RemoveElementHandler;
renameElementHandler: RenameElementHandler;
downloadElementHandler: DownloadElementHandler;
addFilesHandler: AddFilesHandler;
}
@@ -133,6 +135,15 @@ function renderElementWithContext(element: FolderElement, props: FolderProps) {
<ContextMenuContent>
<ContextMenuLabel>{trimFilename(element.name)}</ContextMenuLabel>
<ContextMenuSeparator />
{element.type != FolderElementType.File ? (
<></>
) : (
<ContextMenuItem
onClick={() => props.downloadElementHandler(element)}
>
Download
</ContextMenuItem>
)}
<ContextMenuItem onClick={() => props.renameElementHandler(element)}>
Rename
</ContextMenuItem>

View File

@@ -236,6 +236,26 @@ function generateBreadcrumbElements(path: string[]): BreadcrumbElement[] {
return elements;
}
function downloadData(
data: Uint8Array,
filename: string,
mimeType: string = "application/octet-stream",
) {
const buffer = data.buffer.slice(
data.byteOffset,
data.byteOffset + data.byteLength,
) as ArrayBuffer;
const blob = new Blob([buffer], { type: mimeType });
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = filename;
link.click();
URL.revokeObjectURL(url);
}
export class FilesystemExplorer extends React.Component<
FilesystemExplorerProps,
FilesystemExplorerState
@@ -597,6 +617,12 @@ export class FilesystemExplorer extends React.Component<
this.props.iconCache.delete(file);
}
_downloadFile(file: string) {
const fullPath = makeFullPathWithState(this.state, file);
const data = this.props.filesystem.readFile(fullPath);
downloadData(data, file);
}
render() {
const elements = getFolderElements(this.props.filesystem, this.state.path);
@@ -638,6 +664,7 @@ export class FilesystemExplorer extends React.Component<
renameElementHandler={(e) =>
this.setState({ renameFile: e.name })
}
downloadElementHandler={(e) => this._downloadFile(e.name)}
addFilesHandler={this._onAddFiles}
iconReader={(e) =>
getPeIcon(