В нескольких проектах мы сталкивались с ситуацией, когда пользователю нужно было загрузить файл. Файлы могут быть в разных форматах, например 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.