{
"AllowedHosts": "*",
"urls": "http://localhost:6001",
"uploadServer": {
"rootUrl": "http://localhost:6001", // Основной адрес сайта, если используется прокси, то это будет адрес прокси
"entryPoint1": "/upload", // Общий вход для загрузки
"entryPoint2": "/chunkUpload", // Вход для разделенной загрузки
"virtualPath": "", // Корневой виртуальный путь прослушивания запросов
"physicalPath": "/Users/loogn/Desktop/uploader", // Физический путь корневого каталога загруженных статических файлов
"appendMimes": ".htm3:text/html;", // Дополнительные MIME типы при ответе на запросы
"responseCache": 604800, // Значение кэширования ответа на запросы, единицы измерения — секунды
"jwtSecret": "1234561234", // Секретный ключ шифрования jwt
"limitSize": "20mb", // Максимальный размер загружаемых файлов по умолчанию, поддерживает mb и kb как единицы измерения
"allowExts": ".txt;.jpg;.jpeg;.png;.doc;.docx;.xls;.xlsx;.ppt;.pptx;.pdf", // Разрешенные расширения файлов по умолчанию
"apps": { // Конфигурация конкретных проектов
"default": { // По умолчанию конфигурация
"allowOrigins": "*", // Разрешенные значения origin
"limitExts": ".exe;", // Запрещенные расширения файлов
"enableThumbnail": true, // Активация функции создания миниатюр изображений, требуется установка libgdiplus на osx и linux системах
"thumbnailExts": ".jpg;.png" // Расширения файлов, для которых активируется создание миниатюр
},
"app1": { // Конфигурация проекта app1, формат такой же как default, отсутствующие поля будут использовать значения по умолчанию
"allowOrigins": "*"
}
......
}
}
}
```## Объяснение JWT
Официальный сайт JWT: [jwt.io](https://jwt.io)
JWT payload поддерживает четыре настройки:
1. **exp**: UTC время, обязательное поле, указывает время истечения.
2. **app**: Название проекта и папка хранения файлов, обязательное поле, загруженные этим проектом файлы будут храниться в пути `uploadServer.physicalPath/app/`.
3. **size**: Максимальный размер загрузки этого проекта, поддерживает мегабайты (mb) и килобайты (kb) как единицы измерения, необязательное поле, если его нет, будет использоваться `uploadServer.limitSize`.
4. **exts**: Дополнительные разрешенные расширения файлов этого проекта, необязательное поле, разрешенные расширения файлов этого проекта будут равняться `uploadServer.allowExts` + `exts` - `limitExts`.
### Загрузка
1. **Обычная загрузка**, пример использования в `FrontEndDemo` с `ajaxfileupload.js`, возможно работает и для других случаев, JWT можно передавать через `header` и `form`.
2. **Частями** используйте [simple-uploader](https://github.com/simple-uploader/Uploader), JWT можно передавать через `header` и `form`. Другие параметры следующие:
1. **chunkNumber**: номер части, начинается с 1.
2. **chunkSize**: размер каждой части (в байтах).
3. **totalSize**: общая размер файла (в байтах).
4. **identifier**: уникальный идентификатор файла, одинаковый для всех частей одного файла.
5. **filename**: имя файла, вместе с расширением, например `abc.jpg`.
6. **totalChunks**: общее количество частей.
### Возвращаемое значение
1. **Успешно**, url — это путь к файлу после `rootUrl + physicalPath`
```json
{
"ok": true,
"msg": null,
"url": "http://localhost:6001/test/2019/06/17/abcd.jpg"
}
{"ok": false, "msg": "Файл слишком большой", "url": null}
```## Процесс
Вышеуказанное изображение описывает процесс загрузки и просмотра файлов пользователями. Основные компоненты системы включают ufs и ufs.node ниже. ufs представляет собой единую точку входа для загрузки файлов с веб-сайта или приложения, а ufs распределяет загруженные файлы между различными узлами ufs.node согласно конфигурации. ufs.node возвращает результат загрузки обратно в ufs, что обычно включает URL успешно загруженного файла. Ufs затем возвращает этот URL верхнему уровню приложения. Клиент может использовать полученный URL для отображения или хранения его в базе данных. При доступе к ресурсу пользователем он будет получен непосредственно из различных узлов ufs.node.## Конфигурация ufs
{
"ufs": {
"allowExts": [".txt", ".jpg", ".jpeg", ".png", ".bmp", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf"],
"limitSize": 10485760,
"accessToken": "123456",
"downstreams": [
"http://node1.ufs.loogn.com"
],
"test": {
"limitSize": 10485760,
"accessToken": "abcd"
}
}
}
ufs работает как шлюз для системы загрузки файлов и предоставляет следующие конфигурационные возможности:
{
"ufsNode": {
"mimeModifiers": [
{
"ext": ".htm3",
"type": "text/html",
"opt": "add"
},
{
"ext": ".mp4",
"opt": "remove"
}
],
"domain": "http://node1.ufs.loogn.com",
"physicalPath": "D:/WebSite_Core/ufsnode1/upload",
"virtualPath": "/ufs",
"cachePeriod": 604800,
"enableThumbnail": true,
"thumbnailExts": [
".jpg",
".png"
],
"allowIPs": [
"::1",
"127.0.0.1",
"122.114.222.186"
]
}
}
Конфигурация node включает больше параметров по сравнению с ufs, поскольку реальная функциональность хранения и доступа реализуется именно на конкретном node:1. mimeModifiers - массив, который позволяет модифицировать MIME-тип сервиса Node.js. Каждый элемент этого массива состоит из трёх полей: ext
— расширение файла, type
— отображаемый MIME-тип, opt
— значение, которое может принимать одно из двух значений: add
, remove
.
2. domain - домен, на котором запущен сервис Node.js, влияющий на возвращаемый URL.
3. physicalPath - физический путь для загрузки файлов.
4. virtualPath - виртуальный путь для загрузки файлов, влияющий на возвращаемый URL.
5. cachePeriod - период истечения времени кэширования (в секундах).
6. enableThumbnail - активация функции создания миниатюр.
7. thumbnailExts - список расширений файлов, которые могут использовать функцию создания миниатюр. Это могут быть только типы изображений.
8. allowIPs - белый список IP адресов, используемых для доступа к UFS.При активации функции создания миниатюр можно использовать параметры w и h в URL для получения нужной миниатюры:
Все сжатия выполняются пропорционально, поэтому изображения не деформируются, а также они никогда не увеличиваются независимо от параметров.
Из конфигурации allowIPs видно, что приложение использует accessToken для проверки доступа к ufs, а ufs использует конфигурацию ip адресов в node для проверки доступа к нему. Так как открытый интерфейс является HTTP-интерфейсом, то любыми языками, поддерживающими HTTP, можно воспользоваться.
static async Task<string> UploadFile(string filePath)
{
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("accessToken", "abcd");
httpClient.DefaultRequestHeaders.Add("app", "test");
var buffer = File.ReadAllBytes(filePath);
ByteArrayContent byteArray = new ByteArrayContent(buffer);
byteArray.Headers.Add("ext", Path.GetExtension(filePath));
var response = await httpClient.PostAsync("http://ufs.loogn.com/uploadfile", byteArray);
Примечание: Оригинальный код был корректно отформатирован и не требовал изменения структуры или синтаксиса.```csharp var result = await response.Content.ReadAsStringAsync(); return result; }
1. `accesstoken` — это токен доступа для UFS, который соответствует конфигурации в UFS.
2. `app` — имя приложения, используемого для указания конкретного приложения; кроме того, этот параметр связан с конфигурацией в UFS-сервисах, а также node-сервер создаёт директорию с таким же именем в каталоге `physicalPath`, чтобы хранить загруженные этим приложением файлы.
3. `ext` — расширение файла, важно отметить, что оно должно включать точку (например, `.jpg` вместо `jpg`).
Содержимое файла отправляется методом POST на публичный адрес `uploadfile` UFS. Ответ представляет собой JSON-строку следующего формата:
```json
{
"success": true,
"msg": "",
"fileUrl": "http://node1.ufs.loogn.com/app1/2019/05/10/abc.png"
}
Если загрузка не удалась, значение success
будет false
, а поле msg
будет содержать сообщение об ошибке.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )