разбирать данные zip файла в облачной функции - PullRequest
1 голос
/ 08 октября 2019

Я отправляю FormData() в облачную функцию с чем-то вроде этого во внешнем интерфейсе JavaScript.

//Frontend Angular
const formData = mew FormData();
formData.append('file1', zipFile1);
formData.append('file2', zipFile2);
formData.append('name', 'MyFiles');

this.http.post(urlAPI, formData) //angularJS


//Cloud Function
function main(param) {
   console.log(param);
}

Журнал консоли на param показывает, что content-type - это multipart/form-data взаголовокСуществует также свойство, помеченное как __ow_body. Это значение представляет собой очень длинную строку символов и цифр. Я не уверен, что это такое, но я предполагаю, что это файлы, которые я отправляю в потоковом / сериализованном формате.

{
  __ow_body: 'hf381fh891hv831h93n19384v938v892vn98vn2890vn29n9vn9892vn948vn2893vn2985hv98...'
}

Я хотел подтвердить, являются ли это данные потока, и если да, то как я могу это сделать? разобрать это?

Мне нужно отправить этот файл, который представляет собой zip-файл с изображениями, в API, который я использую. В этом API документов примеры показывают отправку файла в локальной файловой системе, такой как

someApiFunction('./myImgs.zip').then(...);

Проблема заключается в том, что я отправляю свой zip-файл по сетевому протоколу http, и формат, на мой взгляд, сильно отличается отПример чтения файла в локальной файловой системе / машине. Как я могу десериализовать / проанализировать мой файл, чтобы он мог быть распознан как zip-файл, содержащий изображения внутри?

Я пытался использовать fs.createReadStream, но, похоже, он его не анализирует. Он просто сделает объект более структурированным, но внутри этого объекта я не вижу свои formData и его ключи, такие как file1 file2 и name.

Нужно ли мне сначала написать этот файл куда-нибудь?

1 Ответ

0 голосов
/ 08 октября 2019

Даже если это менее вероятно, вы можете попытаться немного изменить способ публикации formData. Я нашел действительно хорошую документацию о том, как использовать formData с Angular . Как указано здесь, вы можете попытаться опубликовать сообщение, используя что-то вроде этого:

  this.httpClient.post<any>(this.SERVER_URL, formData).subscribe(
  (res) => console.log(res),
  (err) => console.log(err)
); 

Это менее вероятно для работы, но вы можете дать ему шанс.

То, что являетсянесомненно то, что из-за того, что Cloud Functions предварительно обрабатывает некоторые запросы , вы можете ожидать, что некоторые библиотеки не будут работать, и я думаю, что это именно та ситуация для вас.

Как этоКак указано в документации по облачным функциям , для обработки multipart / form-data необходимо использовать свойство rawBody запроса и библиотеку bus-boy.

пример кода для обработки запросов такого типа.

...