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

OSCHINA-MIRROR/loogn-UploadServer

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

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

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

  1. Прямая загрузка с фронтенда
  2. Использование JWT и origin для контроля доступа
  3. Разделение файла на части для загрузки
  4. Поддержка загрузки нескольких проектов## Конфигурация
{
  "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"
   }
  1. Несоответствие
         {"ok": false, "msg": "Файл слишком большой", "url": null}  
        ```## Процесс
  2. Клиент отправляет запрос серверу для получения JWT.
  3. Клиент передает JWT в заголовках или теле запроса к интерфейсу загрузки UploadServer.
  4. При успешной загрузке UploadServer возвращает URL загруженного файла клиенту.
  5. Клиент использует URL для отображения или хранения его на сервере.

Проект 2: Распределенная система загрузки файлов ASP.NET Core

Структура системы

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

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

Конфигурация 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.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 )

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

Введение

Сервис для блочной загрузки данных в .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