You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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": {}
}
解决方法
  • 问题根源:

    1. FileReader是浏览器端专属API,Node.js环境无法直接调用,且Adonis.js的request.file()返回的是框架封装的文件对象,并非浏览器的File对象,直接传入会触发错误。
    2. 前端传入的字段名是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,避免数组格式带来的歧义。

内容的提问来源于stack exchange,提问作者positive developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:24:43