Обработка файлов, загружаемых в чат

Сервис Webim позволяет пользователям и операторам обмениваться различными файлами с помощью чата. В этом материале описаны схемы прохождения трафика при работе с файлами.

В статье используется понятие Webim Server. Это серверное программное обеспечение сервиса Webim (бекэнд). Оно может быть установлено либо на серверах сервиса Webim, либо на серверах заказчика.

Оператор скачивает файл из Webim Server

  1. Оператор начинает скачивать файл из Webim Server.
  2. Веб-фронтэнд отправляет запрос файла по ссылке на веб-сервер Nginx.
    Пример ссылки: '/l/o/download/2dda66441cfc481eb2b3f8a7c33b5df/photo_2019-07-17_18-20-35.jpg'.
  3. Происходит реверсивное проксирование запросов на Python сервис.
  4. Python сервис проверяет наличие файла в файловом хранилище по пути /var/pro/client-data/cd/ACCOUNT_NAME/files и соответствие запрашиваемого имени тому, что хранится в мета-информации, производит дополнительные обработки изображений (при запросе превью изображения отдаёт файл 2dda66441cfc481eb2b3f8a7c33b5df_300x300 в разрешении 300x300 (разрешение по умолчанию)).

Схема работы сервиса при скачивании файла оператором:

Схема скачивания файла оператором

Оператор загружает файл на Webim Server

  1. Оператор начинает загружать файл на Webim Server.
  2. Веб-фронтэнд отправляет файл на /l/o/action.php?action=upload_file веб-сервера Nginx.
  3. Происходит реверсивное проксирование запросов на Python сервис.
  4. Python сервис сохраняет файл и мета-информацию о нём в файловое хранилище. Имя файла генерируется как guid — например, 2dda66441cfc481eb2b3f8a7c33b5df. Мета-информация хранится в файле 2dda66441cfc481eb2b3f8a7c33b5df.desc (в соответствии с примером выше). Список хранимых полей:
    • content_type;
    • внутренний id пользователя;
    • имя файла;
    • guid;
    • объём файла.

    Сервис сохраняет файл по пути /var/pro/client-data/cd/ACCOUNT_NAME/files.

Схема работы сервиса при загрузке файла оператором:

Схема загрузки файла оператором

Пользователь скачивает файл из Webim Server

  1. Пользователь начинает скачивать файл из Webim Server.
  2. Веб-фронтэнд или мобильное приложение (работает через Webim Mobile SDK) отправляет запрос файла по ссылке на веб-сервер Nginx.
    Пример ссылки для веб-фронтэнда: '/l/v/download/2dda66441cfc481eb2b3f8a7c33b5df/photo_2019-07-17_18-20-35.jpg?expires=1564763939&hash=592d5761a5d70ff96ed846e907c59206d83c6d13642a04956425026be3b78739'.
    Пример ссылки для мобильного приложения (работает через Webim Mobile SDK): '/l/v/m/download/2dda66441cfc481eb2b3f8a7c33b5df/photo_2019-07-17_18-20-35.jpg?expires=1564763939&hash=592d5761a5d70ff96ed846e907c59206d83c6d13642a04956425026be3b78739'.
  3. Происходит реверсивное проксирование запросов на Python сервис.
  4. Python сервис проверяет наличие файла в файловом хранилище по пути /var/pro/client-data/cd/ACCOUNT_NAME/files и соответствие запрашиваемого имени тому, что хранится в мета-информации, производит дополнительные обработки изображений (при запросе превью изображения отдаёт отдаёт файл 2dda66441cfc481eb2b3f8a7c33b5df_300x300 в разрешении 300x300 (разрешение по умолчанию)).

Схема работы сервиса при скачивании файла пользователем:

Схема скачивания файла пользователем

Пользователь загружает файл на Webim Server

  1. Пользователь начинает загружать файл на Webim Server.
  2. Веб-фронтэнд отправляет файл на /l/v/upload (/l/v/m/upload для мобильного приложения (работает через Webim Mobile SDK)) веб-сервера Nginx.
  3. Происходит реверсивное проксирование запросов на Python сервис.
  4. Python сервис сохраняет файл и мета-информацию о нём в файловое хранилище. Имя файла генерируется как guid — например, 2dda66441cfc481eb2b3f8a7c33b5df. Мета-информация хранится в файле 2dda66441cfc481eb2b3f8a7c33b5df.desc (в соответствии с примером выше). Список хранимых полей:
    • content_type;
    • внутренний id пользователя;
    • имя файла;
    • guid;
    • объём файла.

    Сервис сохраняет файл по пути /var/pro/client-data/cd/ACCOUNT_NAME/files.

Схема работы сервиса при загрузке файла пользователем:

Схема загрузки файла пользователем

Привязка загруженного оператором файла к обращению

Каждое загруженное вложение имеет свой guid-код, который его идентифицирует. Кроме этого, в метаданных файла содержится id посетителя, в чате с которым вложение загружалось. Это позволяет однозначно идентифицировать чат, в который загружается файл.

Список полей:

  • client_content_type - тип файла, заявленный его отправителем;
  • внутренний id пользователя;
  • имя файла;
  • content_type - тип файла, распознанный Webim при помощи библиотеки python-magic;
  • guid;
  • объём файла.

Пример:

{
    "client_content_type":"application/sql",
    "visitor_id":"10750f378f50c6ccdb572520f3ae9bdc",
    "filename":"filename.ext",
    "content_type":"text/plain",
    "guid":"73fff01266414934b181a93061cf26bf",
    "size":2384
}