Файл, передаваемый из узла и превращенный в большой двоичный объект на клиенте javascript, намного больше и поврежден

#node.js #reactjs #express #utf-8 #clio-api

Вопрос:

Я работаю с API Clio, сторонним API, который имеет некоторое облачное хранилище документов. Я хотел бы, чтобы наши пользователи загружали видео/аудио документы из своего API, но из-за его дизайна я должен использовать свой node.js сервер в качестве прокси-сервера для обхода ограничений CORS.

Поток-это:

  1. Пользователи делают запрос на загрузку документа на мой сервер
  2. Мой сервер отправляет запрос в API для загрузки документа
  3. Мой сервер передает ответ клиенту

Поскольку документы могут быть большими (1 ГБ ), я пытаюсь передать потоковую передачу файлов, полученных моим сервером, клиенту.

Проблема в том, что файлы, полученные на клиенте, повреждены и больше, чем сами файлы. Вот как я в настоящее время делаю запросы (примечание: мы обычно используем axios, но я не уверен, как сделать то, что я делаю ниже с этим пакетом, поэтому сейчас я использую пакет запроса для подтверждения концепции):

Для файла MP4 размером около 220 Кб:

 request({
      url: `https://app.clio.com/api/v4/documents/${documentId}/download.json`,
      headers: { Authorization: `Bearer ${accessToken}` },
    }).pipe(res);
 

Затем на клиенте мы получаем ответ типа:

 response.blob()
 

Смущает то, что результирующий большой двоичный объект как таковой:

 Blob {size: 407852, type: "application/mp4"}
 

Размер почти вдвое превышает фактический размер файла, и я не могу понять, почему. Кроме того, загрузка и воспроизведение mp4 отсюда невозможны, потому что файл mp4 поврежден и не может быть воспроизведен. Это особенно странно, потому что, если я решу передать запрос сервера в файл на моем сервере, например, так:

     const filepath = path.resolve(__dirname, "test.mp4");
    const writer = fs.createWriteStream(filepath);

    request({
      url: `https://app.clio.com/api/v4/documents/${documentId}/download.json`,
      headers: { Authorization: `Bearer ${accessToken}` },
    }).pipe(writer);
 

Полученный «test.mp4» имеет правильный размер и воспроизводится нормально.

Проблема, по-видимому, связана с потоковой передачей файла клиенту конкретно. Когда я пытаюсь просмотреть необработанные данные, поступающие на клиента (через response.text ()), пример того, что я вижу, выглядит следующим образом:

 u0000u0000u0000u001cftypmp42u0000u0000u0000u0001mp41mp42isomu0000u0000u0000u0001mdatu0000u0000u0000u0000u0000u0003UJ!*Teamp;(�B��4�p*hUīu0012��Т�u0012ɾ���0�P}�C$��}<��Gc�^�#~��ʠ6�^��m���<E���Yu0013t(Ѳ��x�u0015/3c�(�����u000b�4Ou0006�{$�d_J�\j���^�ԑu0017~�amp;��iǠN�QV��tu0006%�B��05u0012�kW�lu0006hfZ�q7u0000u0006�v%��G���/2*u000eu0001-�^^6i�|
 

Это, похоже, данные в кодировке UTF8 с рядом — я предполагаю — замещающих символов. Я думаю, что это может быть причиной увеличения размера большого двоичного объекта и повреждения файла mp4.

Что могло случиться?