309 lines
10 KiB
Markdown
309 lines
10 KiB
Markdown
# SFTP Browser
|
|
A web-based SFTP file browser for easy server file management.
|
|
|
|
Forked from: https://github.com/kaysting/sftp-browser
|
|
|
|
## Features
|
|
- Connect to SFTP servers hosted on any platform
|
|
- Import and export server connections
|
|
- Navigate directories with ease
|
|
- Sort files by different attributes
|
|
- Show or hide hidden (dot) files
|
|
- Switch between list and tile views
|
|
- Download multiple files/directories as a single zip file
|
|
- Upload files by dragging and dropping or using the button
|
|
- Create new files and directories
|
|
- Rename and delete files
|
|
- Cut/copy/paste files between directories
|
|
- Use "Move to" and "Copy to" dialogs for contextual organization
|
|
- Edit file permissions
|
|
- Recursively search for files by name within a directory
|
|
- View images, videos, and audio files in the browser
|
|
- File size limitations may apply
|
|
- Edit text files in the browser and save directly to the server
|
|
- Syntax highlighting supported for certain languages
|
|
- Edit Markdown files with a live preview
|
|
- Full mobile support with a responsive UI
|
|
|
|
## Connection Management
|
|
SFTP Browser supports seamless connection management through unique connection IDs. When a connection is established via the auto-connection endpoint, a unique `connectionId` is generated, and a URL in the format `/connect/:connectionId` is provided. Accessing this URL allows users to connect to the SFTP server without manually entering credentials, as the connection details are retrieved from the server using the `connectionId`. The connection details are stored temporarily on the server (typically for 12 hours) and in the client's `localStorage` for persistence across sessions. Duplicate connections are prevented by clearing existing connections when a new `/connect/:connectionId` URL is accessed.
|
|
|
|
## API Basics
|
|
|
|
### Authentication
|
|
All API endpoints (except `/auto-connection` and `/connect/:connectionId`) require the following request headers for connecting to the target server:
|
|
- `sftp-host`: The hostname of the server
|
|
- `sftp-port`: The port of the server
|
|
- `sftp-username`: The username to log into
|
|
- `sftp-password`: The password, if using password authentication
|
|
- `sftp-key`: The private key, if using public key authentication
|
|
|
|
### Response Format
|
|
All API responses are in JSON format and include a boolean `success` property. This is `true` if no errors were encountered, or `false` otherwise. If an error occurs, a string `error` property is included with a description of the error.
|
|
|
|
**Successful Response Example:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"...": "..."
|
|
}
|
|
```
|
|
|
|
**Failed Response Example:**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "[error description]",
|
|
"...": "..."
|
|
}
|
|
```
|
|
|
|
Failed responses use a 400 or 500 level HTTP status code.
|
|
|
|
## API Endpoints
|
|
|
|
### Auto-Connection
|
|
**Endpoint:** `POST /auto-connection`
|
|
|
|
Creates a temporary connection to an SFTP server and generates a unique `connectionId` and URL for accessing the connection without re-entering credentials.
|
|
|
|
#### Request Body
|
|
- **Required** `host` (string): The hostname of the server
|
|
- **Required** `username` (string): The username to log into
|
|
- **Optional** `port` (number): The port of the server (defaults to 22)
|
|
- **Optional** `password` (string): The password, if using password authentication
|
|
- **Optional** `privateKey` (string): The private key, if using public key authentication
|
|
|
|
*Note: Either `password` or `privateKey` must be provided.*
|
|
|
|
#### Successful Response
|
|
- `success` (boolean): `true` if the connection was established
|
|
- `connectionId` (string): A unique identifier for the connection
|
|
- `connectionUrl` (string): A URL in the format `https://<host>/connect/:connectionId` for accessing the connection
|
|
|
|
**Example Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"connectionId": "9795d599219c783637efdecc6a91edd8",
|
|
"connectionUrl": "https://sftp.my-mc.link/connect/9795d599219c783637efdecc6a91edd8"
|
|
}
|
|
```
|
|
|
|
#### Failed Response
|
|
- `success` (boolean): `false` if the connection failed
|
|
- `error` (string): Description of the error (e.g., "Missing host")
|
|
|
|
### Fetch Connection Details
|
|
**Endpoint:** `GET /api/connect/:connectionId`
|
|
|
|
Retrieves the connection details for a given `connectionId`, typically used when accessing a `/connect/:connectionId` URL.
|
|
|
|
#### Path Parameters
|
|
- **Required** `connectionId` (string): The unique identifier for the connection
|
|
|
|
#### Successful Response
|
|
- `success` (boolean): `true` if the connection details were found
|
|
- `connection` (object): The connection details
|
|
- `host` (string): The hostname of the server
|
|
- `port` (number): The port of the server
|
|
- `username` (string): The username
|
|
- `password` (string, optional): The password, if provided
|
|
- `privateKey` (string, optional): The private key, if provided
|
|
|
|
**Example Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"connection": {
|
|
"host": "my-mc.link",
|
|
"port": 39125,
|
|
"username": "mc",
|
|
"password": "IJhPT15nlOIoJm53"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Failed Response
|
|
- `success` (boolean): `false` if the connection was not found
|
|
- `error` (string): Description of the error (e.g., "Connection not found")
|
|
|
|
### List Files in a Directory
|
|
**Endpoint:** `GET /api/sftp/directories/list`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The target directory path
|
|
- **Optional** `dirsOnly` (boolean): If `true`, only directories are returned
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `list` (object[]): An array of file objects
|
|
- `list[].name` (string): The name of the file
|
|
- `list[].accessTime` (number): Timestamp of the last access time
|
|
- `list[].modifyTime` (number): Timestamp of the last modification time
|
|
- `list[].size` (number): File size in bytes
|
|
- `list[].type` (string): A 1-character string representing the file type
|
|
- `list[].group` (number): ID of the group the file belongs to
|
|
- `list[].owner` (number): ID of the user the file belongs to
|
|
- `list[].rights` (object): Permissions for the file
|
|
- `list[].rights.user` (string): Permissions for the owner (`r`, `w`, `x`)
|
|
- `list[].rights.group` (string): Permissions for the group (`r`, `w`, `x`)
|
|
- `list[].rights.other` (string): Permissions for others (`r`, `w`, `x`)
|
|
- `list[].longname` (string): Raw SFTP output for the file
|
|
|
|
### Create a Directory
|
|
**Endpoint:** `POST /api/sftp/directories/create`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The new directory path
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
|
|
### Delete a Directory
|
|
**Endpoint:** `DELETE /api/sftp/directories/delete`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the directory to delete
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
|
|
### Check if a Path Exists
|
|
**Endpoint:** `GET /api/sftp/files/exists`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path to check
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `exists` (boolean): `true` if the path exists, `false` otherwise
|
|
- `type` (string|boolean): File type character if the path exists, `false` otherwise
|
|
|
|
### Get Information About a File
|
|
**Endpoint:** `GET /api/sftp/files/stat`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path to stat
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `stats` (object): File statistics
|
|
- `accessTime` (number): Last accessed time
|
|
- `modifyTime` (number): Last modified time
|
|
- `size` (number): File size in bytes
|
|
- `uid` (number): ID of the file's owner
|
|
- `gid` (number): ID of the file's group
|
|
- `mode` (number): Integer representing file type and permissions
|
|
- `isBlockDevice` (boolean): `true` if a block device
|
|
- `isCharacterDevice` (boolean): `true` if a character device
|
|
- `isDirectory` (boolean): `true` if a directory
|
|
- `isFIFO` (boolean): `true` if a first-in first-out file
|
|
- `isSocket` (boolean): `true` if a socket
|
|
- `isSymbolicLink` (boolean): `true` if a symlink
|
|
|
|
### Get Raw File Data
|
|
**Endpoint:** `GET /api/sftp/files/get/single`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the file
|
|
|
|
#### Successful Response
|
|
- *Raw file data*
|
|
|
|
#### Failed Response
|
|
- *JSON error response*
|
|
|
|
### Get File Download Link
|
|
Gets a temporary URL to download a single file without connection headers. URLs last 24 hours or until the server restarts.
|
|
|
|
**Endpoint:** `GET /api/sftp/files/get/single/url`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the file
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `download_url` (string): The download URL
|
|
|
|
### Get Zipped Download Link
|
|
Gets a temporary URL for downloading files and directories as a zip archive without connection headers.
|
|
|
|
**Endpoint:** `GET /api/sftp/files/get/multi`
|
|
|
|
#### Query Parameters
|
|
- **Required** `paths` (string[]): JSON-formatted array of file or directory paths
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `download_url` (string): The download URL
|
|
|
|
### Create a File
|
|
**Endpoint:** `POST /api/sftp/files/create`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the new file
|
|
|
|
#### Request Body
|
|
- *Raw data to insert into the new file*
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
|
|
### Append Data to a File
|
|
**Endpoint:** `PUT /api/sftp/files/append`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the file
|
|
|
|
#### Request Body
|
|
- *Raw data to append to the file*
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
|
|
### Move a File
|
|
**Endpoint:** `PUT /api/sftp/files/move`
|
|
|
|
#### Query Parameters
|
|
- **Required** `pathOld` (string): The current path
|
|
- **Required** `pathNew` (string): The new path
|
|
|
|
#### Successful Response
|
|
- `pathOld` (string): The normalized old path
|
|
- `pathNew` (string): The normalized new path
|
|
|
|
### Copy a File
|
|
Directories not supported.
|
|
|
|
**Endpoint:** `PUT /api/sftp/files/copy`
|
|
|
|
#### Query Parameters
|
|
- **Required** `pathSrc` (string): The source path
|
|
- **Required** `pathDest` (string): The destination path
|
|
|
|
#### Successful Response
|
|
- `pathSrc` (string): The normalized source path
|
|
- `pathDest` (string): The normalized destination path
|
|
|
|
### Edit a File's Permissions
|
|
Directories supported, but without recursion.
|
|
|
|
**Endpoint:** `PUT /api/sftp/files/chmod`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the file
|
|
- **Required** `mode` (string): The new mode in the form `xyz`, where `x`, `y`, and `z` are integers from 0 to 7
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path
|
|
- `mode` (string): The supplied mode
|
|
|
|
### Delete a File
|
|
**Endpoint:** `DELETE /api/sftp/files/delete`
|
|
|
|
#### Query Parameters
|
|
- **Required** `path` (string): The path of the file
|
|
|
|
#### Successful Response
|
|
- `path` (string): The normalized path |