{
"AllowedHosts": "*",
"urls": "http://localhost:6001",
"uploadServer": {
"rootUrl": "http://localhost:6001", // Основной URL для доступа, если используется прокси, то URL прокси
"entryPoint1": "/upload", // Основной URL для загрузки файлов
"entryPoint2": "/chunkUpload", // URL для загрузки файлов по частям
"virtualPath": "", // Виртуальный путь для прослушивания запросов
"physicalPath": "/Users/loogn/Desktop/uploader", // Физический путь для хранения загруженных файлов
"appendMimes": ".htm3:text/html;", // Дополнительные MIME-типы для ответа на запросы
"responseCache": 604800, // Время кэширования ответов на запросы, секунды
"jwtSecret": "1234561234", // Секретный ключ для шифрования jwt
"limitSize": "20mb", // Максимальный размер загружаемых файлов, мегабайты или килобайты
"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, не указанные значения берутся из default
"allowOrigins": "*"
}
......
}
}
}
```## Описание JWT
Официальный сайт JWT: [jwt.io](https://jwt.io)
В payload JWT поддерживаются четыре параметра:
1. exp : UTC-время, обязательное поле, указывает время истечения
2. app : Имя проекта и папка для хранения файлов, обязательное поле, файлы проекта будут храниться в uploadServer.physicalPath/app/
3. size : Максимальный размер загружаемых файлов проекта, мегабайты или килобайты, необязательное поле, если не указано, используется 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"}
```
2. Неудачно:
```json
{"ok":false,"msg":"Файл слишком большой","url":null}
```## Поток
1. Клиент отправляет запрос на сервер для получения JWT.
2. Клиент отправляет запрос на UploadServer для загрузки файла, используя JWT в заголовке или форме.
3. При успешной загрузке UploadServer возвращает URL загруженного файла клиенту.
4. Клиент использует URL для отображения или хранения в базе данных.
# Проект 2, распределенная система загрузки файлов ASP.NET Core
## Схема архитектуры системы

Вышеуказанная схема описывает процесс загрузки и просмотра файлов. Система в основном включает ufs и ufs.node.
ufs — это единственный интерфейс для загрузки файлов с веб-сайта или приложения. ufs распределяет загруженные файлы на ufs.node в соответствии с конфигурацией.
ufs.node возвращает результат загрузки ufs, в основном URL загруженного файла. ufs передает URL обратно клиенту.
Клиент использует URL для отображения или хранения в базе данных.
При доступе к ресурсу пользователь получает его напрямую из ufs.node.## Конфигурация ufs
```json
{
"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:
mimeModifiers
позволяет изменять MIME-типы для node-сервера. Каждый элемент массива имеет три свойства: ext
— расширение файла, type
— соответствующий MIME-тип, opt
— значение add
или remove
.
2.domain
— домен, на котором запущен node-сервер, влияет на возвращаемые URL.physicalPath
— физический путь для загрузки файлов.virtualPath
— виртуальный путь для загрузки файлов, влияет на возвращаемые URL.cachePeriod
— период кэширования (в секундах).enableThumbnail
— включение функции создания миниатюр.thumbnailExts
— список расширений файлов, для которых можно создать миниатюры (только изображения).allowIPs
— белый список IP-адресов, разрешенных для доступа к node-серверу.При включении функции создания миниатюр, можно использовать параметры 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;
}
HTTP-запрос должен содержать три параметра в заголовке:
accesstoken
— токен для доступа к UFS, соответствующий конфигурации в UFS.app
— имя приложения, которое используется для создания директории с таким же именем в директории physicalPath
на сервере node, куда будут загружаться файлы этого приложения.ext
— расширение загружаемого файла, включая точку (например, .jpg
, а не jpg
).Содержимое файла отправляется в теле POST-запроса на публичный адрес uploadfile
UFS. Ответ возвращается в формате JSON, например:{"success":true, "msg":"", "fileUrl":"http://node1.ufs.loogn.com/app1/2019/05/10/abc.png"}
Если загрузка не удалась, поле success
будет false
, а поле msg
будет содержать сообщение об ошибке.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )