在Node.js(Adonis.js)中将请求文件转Base64编码报错解决
问题
我正在使用Adonis.js框架,尝试编写代码将请求中的文件转换为Base64编码字符串,代码如下:
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' const FileReader = require('file-reader'); export default class MyController { public async test({ request, response }: HttpContextContract) {; const fileToBase64 = async (file) => new Promise((resolve, reject) => { const reader = new FileReader() reader.readAsDataURL(file) reader.onload = () => resolve(reader.result) reader.onerror = (e) => reject(e) }) const file = request.file('files') const imageStr = await fileToBase64(file) return imageStr } }
运行该函数时出现错误:
invalid glob pattern: undefined
请求文件的返回结果为:
{ "fieldName": "files[]", "clientName": "test.xlsx", "size": 8212, "type": "application", "extname": "xlsx", "subtype": "vnd.openxmlformats-officedocument.spreadsheetml.sheet", "state": "consumed", "isValid": true, "validated": true, "errors": [], "meta": {} }
解决方法
问题根源:
FileReader是浏览器端专属API,Node.js环境无法直接调用,且Adonis.js的request.file()返回的是框架封装的文件对象,并非浏览器的File对象,直接传入会触发错误。- 前端传入的字段名是
files[](数组格式),但代码中用request.file('files')获取,字段名不匹配导致文件读取异常。
修正后的代码:
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' import fs from 'fs/promises' export default class MyController { public async test({ request, response }: HttpContextContract) { // 匹配前端传入的字段名files[] const file = request.file('files[]') if (!file) { return response.badRequest('未上传文件') } // 读取临时文件并转换为Base64 const fileBuffer = await fs.readFile(file.tmpPath) const base64Str = fileBuffer.toString('base64') // 如果需要生成带MIME前缀的Data URL格式,可使用下面一行替代 // const dataUrl = `data:${file.type}/${file.subtype};base64,${base64Str}` return base64Str } }
- 核心说明:
- Adonis.js处理上传文件后,会将文件存储在临时目录,通过
file.tmpPath可获取文件路径。 - 使用Node.js原生的
fs.readFile读取文件缓冲区,再转换为Base64字符串,这是Node环境下处理文件转Base64的标准方式。 - 确保后端获取文件时的字段名与前端传入的完全一致,若为单文件上传,建议前端将字段名改为
files,避免数组格式带来的歧义。
- Adonis.js处理上传文件后,会将文件存储在临时目录,通过
内容的提问来源于stack exchange,提问作者positive developer
相关产品推荐
相关产品推荐

