# Работа c файлами

# Отправка файла

Отправка файла осуществляется в три этапа:

  1. Создание задачи на загрузку файла. Клиент инициирует создание загрузки и получает необходимые идентификаторы.

  2. Передача файла в файловое хранилище сервера. Файл загружается на сервер с помощью HTTP-запроса (см. пример ниже).

  3. Отправка сообщения с прикреплённым файлом. В чате создаётся сообщение, в котором указывается идентификатор ранее загруженного файла.

# Создание задачи на загрузку файла

Запрос:

{
  "type": 1,
  "id": 5,
  "method": "uploadFile",
  "payload": {
    "fileSize": 1487
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST
id uint32 Да Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут
method string Да Команда uploadFile
fileSize number Да Размер файла в байтах

Ответ:

{
  "type": 2,
  "id": 5,
  "payload": {
    "uploadTaskId": "2e9537c4-e82c-467c-a149-3c1b41326def"
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
uploadTaskId string Да Идентификатор задачи на загрузку файла

В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.

# Загрузка файла в файловое хранилище

Для загрузки файла в хранилище необходимо выполнить HTTP-запрос к серверу. Перечисленные ниже параметры указываются в HTTP-заголовках, а не передаются в URL (query string):

POST /bridge/api/client/v1/files HTTP/1.1
Upload-Task-Id: 2e9537c4-e82c-467c-a149-3c1b41326def
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQeFqWQPxCmHvCIyc
Content-Length: 2081

------WebKitFormBoundaryQeFqWQPxCmHvCIyc
Content-Disposition: form-data; name="file"; filename="some_image.png"
Content-Type: image/png

<file binary data>
------WebKitFormBoundaryQeFqWQPxCmHvCIyc
Content-Disposition: form-data; name="preview"; filename="d970f81f-d433-401c-8182-d33c59b96cd5"
Content-Type: image/webp

<preview binary data>
------WebKitFormBoundaryQeFqWQPxCmHvCIyc
Заголовок Обяз. Описание
Upload-Task-Id Да Идентификатор задачи на загрузку файла, полученный ранее из команды uploadFile

Тело запроса должно быть представлено в виде объекта FormData с типом multipart/form-data и содержать обязательное поле file, содержащее сам файл. Если у файла есть превью, то оно должно быть помещено в форму в поле preview, название под которым помещается превью должно отличаться от названия самого файла. И файл и превью помещаются в бинарном виде.

Ответ:

В случае успешной загрузки, HTTP-сервер ответит кодом 200 OK:

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Server: TrueConf Bridge
Content-Type: application/json
Content-Length: 57
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: height,mime,request_id,preview,cid

{
  "temporalFileId": "2e9537c4-e82c-467c-a149-3c1b41326def"
}

В теле ответа содержится поле temporalFileId – временный идентификатор файла, готового для отправки в сообщении. После отправки этот идентификатор теряет какие-либо полезные свойства.

Ошибка:

В случае ошибки, HTTP-сервер ответит кодом 400 Bad Request:

HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 62

{
  "error": 310,
  "error_description": "No upload task ID provided",
}

# Отправка файла в сообщении

Запрос:

{
  "type": 1,
  "id": 6,
  "method": "sendFile",
  "payload": {
    "chatId": "bea15543d971a83c8ba1f103104791762c6b4b8f",
    "content": {
      "temporalFileId": "32506b12-6a1a-4cd3-be24-373c7bcf9510"
    }
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST
id uint32 Да Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут
method string Да Команда sendFile
chatId string Да Идентификатор чата для отправки сообщения
temporalFileId string Да Временный идентификатор файла, полученный в ответе на HTTP-запрос

Ответ:

{
  "type": 2,
  "id": 6,
  "payload": {
    "chatId": "bea15543d971a83c8ba1f103104791762c6b4b8f",
    "timestamp": 1735134222098,
    "messageId": "c8c3eee8-9ad0-4638-9692-ad16391a4256",
    "fileId": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
chatId string Да Идентификатор чата
timestamp number Да Временная метка отправки сообщения в формате UNIX timestamp с точностью до миллисекунд
messageId string Да Идентификатор отправленного сообщения
fileId string Да Постоянный идентификатор отправленного файла для получения информации о нем

В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.

# Получение информации о файле и его скачивание

Для получения расширенной информации о входящем файле в чате необходимо использовать значение payload.content.id, полученное из входящего запроса о новом сообщении.

Запрос:

{
  "method": "getFileInfo",
  "id": 9,
  "type": 1,
  "payload": {
    "fileId": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST
id uint32 Да Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут
method string Да Команда getFileInfo
fileId string Да Идентификатор файла из входящего запроса о новом сообщении

Ответ:

{
    "type": 2,
    "id": 9,
    "payload": {
        "name": "AirHelp_Logo.webp",
        "size": 3446,
        "mimeType": "image/webp",
        "downloadUrl": "https://10.111.15.116/bridge/api/client/v1/files?file_id=e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5",
        "readyState": 2,
        "previews": [
            {
                "name": "preview-2278f47b821f72e4a44ab6b980180518.webp",
                "mimeType": "image/webp",
                "size": 1264,
                "downloadUrl": "https://10.111.15.116/bridge/api/client/v1/files/preview?file_id=e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
            }
        ],
        "infoHash": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
    }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
name string Да Имя файла
size number Да Размер файла в байтах
mimeType string Да MIME-тип файла
downloadUrl string Да URL для скачивания файла
readyState FileReadyStateEnum Да Состояние файла на сервере
infoHash string Да Идентификатор файла на сервере
previews Array Да Массив превью файла, повторяющий вышеописанные параметры

Для скачивания файла или его превью необходимо отправить HTTP GET-запрос на адрес, указанный в downloadUrl.

В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.

# Подписка на прогресс загрузки файла на сервер

Если файл находится в состоянии UPLOADING, то можно подписаться на процесс загрузки, чтобы узнать, когда файл станет доступен.

Запрос:

{
  "method": "subscribeFileProgress",
  "id": 10,
  "type": 1,
  "payload": {
    "fileId": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST
id uint32 Да Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут
method string Да Команда subscribeFileProgress
fileId string Да Идентификатор файла на сервере

Ответ:

{
  "id": 10,
  "type": 2,
  "payload": {
    "result": true
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
result boolean Да Получилось ли подписаться на загрузку

В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.

# Получение событий загрузки файла

После подписки на загрузку по веб-сокету начнут приходить события uploadingProgress:

{
  "id": 3,
  "type": 1,
  "method": "uploadingProgress",
  "payload": {
    "fileId": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5",
    "progress": 123
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST от сервера
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
fileId string Да Идентификатор файла на сервере
progress number Да Количество байт, загруженных на сервер

Когда придёт сообщение, в котором значение progress будет равно значению поля size из ответа getFileInfo, файл считается полностью загруженным и может быть получен с помощью GET-запроса. После этого события с обновлённым progress больше не поступают. Если файл уже был загружен ранее, будет отправлено только одно финальное событие, эквивалентное последнему.

# Отписка от получения события загрузки

При необходимости можно отписаться от получения событий загрузки файла на сервер.

Запрос:

{
  "method": "unsubscribeFileProgress",
  "id": 10,
  "type": 1,
  "payload": {
    "fileId": "e09dbd63a16bd8cd7bddda7193c1c4ff0d2f6de5"
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST
id uint32 Да Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут
method string Да Команда unsubscribeFileProgress
fileId string Да Идентификатор файла на сервере

Ответ:

{
  "id": 10,
  "type": 2,
  "payload": {
    "result": true
  }
}
Параметр Тип Обяз. Описание
type uint32 Да Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE
id uint32 Да Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа
result boolean Да Получилось ли отписаться от получения событий о загрузке файла

В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.

Обновлено: 19.07.2025