В нескольких проектах мы сталкивались с ситуацией, когда пользователю нужно было загрузить файл. Файлы могут быть в разных форматах, например PDF, TXT, MP3, JPG и т. Д.

Ниже приведен простой способ добиться этого с помощью функций Azure с nodejs.

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

const rawFile = await q.nfcall(fs.readFile, filePath);

Затем нам нужно преобразовать его в base64:

const fileBuffer = Buffer.from(rawFile, ‘base64’);

Теперь в expressjs у нас есть более мощные возможности для возврата файла, такие как res.send, res.end или res.sendFile. Но в функциях Azure эта функция отсутствует.

Итак, что мы можем сделать, так это изменить заголовки ответов, чтобы указать, что мы хотим вернуть файл, например:

context.res = {
   status: 202,
   body: fileBuffer,
   headers: {
      "Content-Disposition": "inline"
   }
};
context.done();

В этом случае мы указываем, что хотим, чтобы браузер открывал файл в режиме онлайн.

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

context.res = {
  status: 202,
  body: fileBuffer,
  headers: {
     "Content-Disposition": `attachment; filename=${fileName}`
  }
};
context.done();

В React или любой другой платформе js, которую вы используете, нам просто нужно перенаправить на конечную точку функции azure, поскольку это HTTP GET, у него не будет никаких проблем. например

const url = `https://[pathToAzureFunction]/api/attachment/${fileType}?code=[FunctionCode]`;
window.open(url, ‘_blank’);

Вы также можете протестировать функцию Azure с помощью такого инструмента, как почтальон.

например, функция Azure:

Очень важно: этот метод недействителен для файлов большого размера (›Гб), поскольку функции azure node js не возвращают поток. Если вам нужно более продвинутое решение, вам может потребоваться реализовать его на C # или вообще отказаться от функций azure и выбрать http-сервер, например express js.

Надеюсь, это поможет избежать проблем с загрузкой файлов с помощью функций Azure.