1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/loogn-UploadServer

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
readme.md

Проект 1. Унифицированный сервис загрузки файлов

Основные характеристики

  1. Прямая загрузка файлов с фронтенда
  2. Использование jwt и origin для управления правами доступа
  3. Загрузка файлов по частям
  4. Поддержка загрузки файлов для нескольких проектов## Конфигурация
{
  "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
## Схема архитектуры системы
![](https://gitee.com/loogn/ufs/raw/master/art.png)

Вышеуказанная схема описывает процесс загрузки и просмотра файлов. Система в основном включает 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 работает как шлюз для системы загрузки файлов, предоставляя следующие конфигурации:

  1. allowExts — конфигурация разрешенных типов файлов
  2. limitSize — ограничение размера загружаемых файлов
  3. accessToken — токен для доступа к системе загрузки файлов
  4. downstreams — конфигурация узлов ufs.nodeВ конфигурации выше, на уровне ufs также есть узел test, который имеет те же подузлы, что и узел ufs. Цель — обеспечить загрузку файлов для различных приложений. "test" — это имя приложения, которое согласовано с приложением. При загрузке файла приложением app1, оно указывает, что это app1, и использует конфигурацию app1 из файла конфигурации. Если в файле конфигурации нет конфигурации для app1, используется конфигурация по умолчанию для узла ufs. Такой подход конфигурации похож на загрузку файла конфигурации (appsettings.json), которая использует специфическую конфигурацию для перекрытия конфигурации по умолчанию, что делает его очень гибким. Как это работает, мы обсудим позже.

Конфигурация ufs.node

{
  "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-сервера. Каждый элемент массива имеет три свойства: ext — расширение файла, type — соответствующий MIME-тип, opt — значение add или remove. 2.domain — домен, на котором запущен node-сервер, влияет на возвращаемые URL.
  2. physicalPath — физический путь для загрузки файлов.
  3. virtualPath — виртуальный путь для загрузки файлов, влияет на возвращаемые URL.
  4. cachePeriod — период кэширования (в секундах).
  5. enableThumbnail — включение функции создания миниатюр.
  6. thumbnailExts — список расширений файлов, для которых можно создать миниатюры (только изображения).
  7. allowIPs — белый список IP-адресов, разрешенных для доступа к node-серверу.При включении функции создания миниатюр, можно использовать параметры w и h в URL для получения нужных миниатюр:
  • Оригинальное изображение: http://node1.ufs.loogn.com/app1/2019/05/10/abc.png
  • Миниатюра с шириной 200 пикселей: http://node1.ufs.loogn.com/app1/2019/05/10/abc.png?w=200
  • Миниатюра с высотой 200 пикселей: http://node1.ufs.loogn.com/app1/2019/05/10/abc.png?h=200
  • Миниатюра с размером 100x200 пикселей: http://node1.ufs.loogn.com/app1/2019/05/10/abc.png?w=100&h=200 Все сжатия выполняются пропорционально, изображения не искажаются, и параметры не увеличивают размер изображения.Из конфигурации 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-запрос должен содержать три параметра в заголовке:

  1. accesstoken — токен для доступа к UFS, соответствующий конфигурации в UFS.
  2. app — имя приложения, которое используется для создания директории с таким же именем в директории physicalPath на сервере node, куда будут загружаться файлы этого приложения.
  3. 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Сервис для блочной загрузки данных в .NET Core, система распределённой загрузки файлов в .NET Core. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/loogn-UploadServer.git
git@api.gitlife.ru:oschina-mirror/loogn-UploadServer.git
oschina-mirror
loogn-UploadServer
loogn-UploadServer
master