#node.js #reactjs #express #utf-8 #clio-api
Вопрос:
Я работаю с API Clio, сторонним API, который имеет некоторое облачное хранилище документов. Я хотел бы, чтобы наши пользователи загружали видео/аудио документы из своего API, но из-за его дизайна я должен использовать свой node.js сервер в качестве прокси-сервера для обхода ограничений CORS.
Поток-это:
- Пользователи делают запрос на загрузку документа на мой сервер
- Мой сервер отправляет запрос в API для загрузки документа
- Мой сервер передает ответ клиенту
Поскольку документы могут быть большими (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.
Что могло случиться?