An open-source React.js package for easy integration of a file manager into applications. It provides a user-friendly interface for managing files and folders, including viewing, uploading, and deleting, with full UI and backend integration.
✨ Features
- File & Folder Management: View, upload, download, delete, copy, move, create, and rename files or folders seamlessly.
- Grid & List View: Switch between grid and list views to browse files in your preferred layout.
- Navigation: Use the breadcrumb trail and sidebar navigation pane for quick directory traversal.
- Toolbar & Context Menu: Access all common actions (upload, download, delete, copy, move, rename, etc.) via the toolbar or right-click for the same options in the context menu.
- Multi-Selection: Select multiple files and folders at once to perform bulk actions like delete, copy, move, or download.
- Keyboard Shortcuts: Quickly perform file operations like copy, paste, delete, and more using intuitive keyboard shortcuts.
- Drag-and-Drop: Move selected files and folders by dragging them to the desired directory, making file organization effortless.
🚀 Installation
To install React File Manager
, use the following command:
npm i @cubone/react-file-manager
💻 Usage
Here’s a basic example of how to use the File Manager Component in your React application:
import { useState } from "react";
import { FileManager } from "@cubone/react-file-manager";
import "@cubone/react-file-manager/dist/style.css";
function App() {
const [files, setFiles] = useState([
{
name: "Documents",
isDirectory: true,
path: "/Documents",
updatedAt: "2024-09-09T10:30:00Z",
},
{
name: "Pictures",
isDirectory: true,
path: "/Pictures",
updatedAt: "2024-09-09T11:00:00Z",
},
{
name: "Pic.png",
isDirectory: false,
path: "/Pictures/Pic.png",
updatedAt: "2024-09-08T16:45:00Z",
size: 2048,
},
]);
return (
<>
<FileManager files={files} />
</>
);
}
export default App;
📂 File Structure
The files
prop accepts an array of objects, where each object represents a file or folder. You can customize the structure to meet your application needs. Each file or folder object follows the structure detailed below:
type File = {
name: string;
isDirectory: boolean;
path: string;
updatedAt?: string;
size?: number;
};
⚙️ Props
Name | Type | Description |
---|
acceptedFileTypes | string | (Optional) A comma-separated list of allowed file extensions for uploading specific file types (e.g., .txt, .png, .pdf ). If omitted, all file types are accepted. |
enableFilePreview | boolean | A boolean flag indicating whether to use the default file previewer in the file manager default: true . |
filePreviewPath | string | The base URL for file previews e.g.https://example.com , file path will be appended automatically to it i.e. https://example.com/yourFilePath . |
fileUploadConfig | { url: string; headers?: { [key: string]: string } } | Configuration object for file uploads. It includes the upload URL (url ) and an optional headers object for setting custom HTTP headers in the upload request. The headers object can accept any standard or custom headers required by the server. Example: { url: "https://example.com/fileupload", headers: { Authorization: "Bearer" + TOKEN, "X-Custom-Header": "value" } } |
files | Array<File> | An array of file and folder objects representing the current directory structure. Each object includes name , isDirectory , and path properties. |
height | string | number | The height of the component default: 600px . Can be a string (e.g., '100%' , '10rem' ) or a number (in pixels). |
isLoading | boolean | A boolean state indicating whether the application is currently performing an operation, such as creating, renaming, or deleting a file/folder. Displays a loading state if set true . |
layout | "list" | "grid" | Specifies the default layout style for the file manager. Can be either "list" or "grid". Default value is "grid". |
maxFileSize | number | For limiting the maximum upload file size in bytes. |
onCreateFolder | (name: string, parentFolder: File) => void | A callback function triggered when a new folder is created. Use this function to update the files state to include the new folder under the specified parent folder using create folder API call to your server. |
onDelete | (files: Array<File>) => void | A callback function is triggered when one or more files or folders are deleted. |
onDownload | (files: Array<File>) => void | A callback function triggered when one or more files or folders are downloaded. |
onError | (error: { type: string, message: string }, file: File) => void | A callback function triggered whenever there is an error in the file manager. Where error is an object containing type ("upload", etc.) and a descriptive error message . |
onFileOpen | (file: File) => void | A callback function triggered when a file or folder is opened. |
onFileUploaded | (response: { [key: string]: any }) => void | A callback function triggered after a file is successfully uploaded. Provides JSON response holding uploaded file details, use it to extract the uploaded file details and add it to the files state e.g. setFiles((prev) => [...prev, JSON.parse(response)]); |
onFileUploading | (file: File, parentFolder: File) => { [key: string]: any } | A callback function triggered during the file upload process. You can also return an object with key-value pairs that will be appended to the FormData along with the file being uploaded. The object can contain any number of valid properties. |
onLayoutChange | (layout: "list" | "grid") => void | A callback function triggered when the layout of the file manager is changed. |
onPaste | (files: Array<File>, destinationFolder: File, operationType: "copy" | "move") => void | A callback function triggered when when one or more files or folders are pasted into a new location. Depending on operationType , use this to either copy or move the sourceItem to the destinationFolder , updating the files state accordingly. |
onRefresh | () => void | A callback function triggered when the file manager is refreshed. Use this to refresh the files state to reflect any changes or updates. |
onRename | (file: File, newName: string) => void | A callback function triggered when a file or folder is renamed. |
width | string | number | The width of the component default: 100% . Can be a string (e.g., '100%' , '10rem' ) or a number (in pixels). |
⌨️ Keyboard Shortcuts
Action | Shortcut |
---|
New Folder | Alt + Shift + N |
Upload Files | CTRL + U |
Cut | CTRL + X |
Copy | CTRL + C |
Paste | CTRL + V |
Rename | F2 |
Download | CTRL + D |
Delete | DEL |
Select All Files | CTRL + A |
Select Multiple Files | CTRL + Click |
Select Range of Files | Shift + Click |
Switch to List Layout | CTRL + Shift + 1 |
Switch to Grid Layout | CTRL + Shift + 2 |
Jump to First File in the List | Home |
Jump to Last File in the List | End |
Refresh File List | F5 |
Clear Selection | Esc |
🤝 Contributing
Contributions are welcome! To contribute:
- Fork the repository.
- Create a new branch (
git checkout -b feature/branch-name
). - Make your changes.
- Commit your changes (
git commit -m 'Add some feature'
). - Push to the branch (
git push origin feature/branch-name
). - Open a Pull Request.
Get started by running following commands:
git clone https://github.com/Saifullah-dev/react-file-manager.git
cd react-file-manager
Frontend
cd frontend
npm i
npm run dev
The application should now be running on http://localhost:5173
.
Backend
cd backend
npm i
npm run devStart
The server should now be running on http://localhost:3000
, have fun!
©️ License
React File Manager is MIT Licensed.