You need to enable JavaScript to run this app. 如何在Nestjs中使用Multer直接上传图片到Azure?是否需要特定库?
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nestjs中使用Multer直接上传图片到Azure?是否需要特定库?

Nestjs 基于Multer直传图片到Azure的实现说明

核心依赖说明

这里直接回应你关心的“是否需要特定第三方库”的问题:

  • 不需要额外找花里胡哨的OSS整合组件,也不用装小众的Multer第三方适配包,只需要两个核心依赖就能跑通全流程:
    • 项目默认安装的@nestjs/platform-express:本身就内置了适配好版本的Multer文件上传能力,和Nest的装饰器体系完全打通,别额外重复安装multer核心包,不然很容易因为版本不一致出现类型报错
    • Azure官方提供的Blob Storage SDK包@azure/storage-blob:用来和Azure Blob服务做文件交互,是官方长期维护的原生SDK,稳定性和兼容性比第三方薄封装包好很多

全流程实操步骤

1. 提前完成Azure侧准备工作

  • 在Azure控制台打开Blob Storage服务,新建一个独立的存储容器,把容器的公共访问级别设置为“Blob匿名读”——这样传完的图片可以直接生成公网访问链接,不需要额外生成临时签名
  • 从存储账户的访问密钥页面,复制好两个关键信息:存储账户的连接字符串、目标容器的名称,后续通过环境变量引入到项目里,别硬编码在代码中

2. 实现自定义Multer存储引擎直连Azure

Multer本身默认不支持Azure存储,也没有内置的官方适配引擎,我们只要基于Multer的自定义存储接口写个轻量实现就行,全程不用把文件落地到本地服务器磁盘:

  • 先在项目里新建独立的存储引擎实现文件,核心逻辑只需要覆盖Multer存储引擎的两个标准方法:
    • _handleFile:接收Multer传过来的文件流,生成带随机前缀的不重复文件名(避免同名下的文件被覆盖)
    • 调用Azure Blob SDK的上传方法,把文件流直接推送到目标存储容器里
    • 上传完成后把Blob的公网访问链接挂到文件对象的自定义属性上,方便后续接口直接返回给前端
    • _removeFile:实现文件删除的兜底逻辑,方便后续做上传失败时的资源清理
      核心上传逻辑示例:
// 获取Azure Blob客户端实例
const containerClient = blobServiceClient.getContainerClient(containerName);
// 生成不重复的Blob名称
const blobName = `${Date.now()}-${file.originalname}`;
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
// 直接上传Multer传来的文件流,无本地磁盘落地
await blockBlobClient.uploadStream(file.stream);
// 把公网链接挂到文件对象上
file.publicUrl = blockBlobClient.url;

3. 在Nest接口中集成上传能力

  • 在对应的控制器中,用@UseInterceptors(FileInterceptor)装饰器绑定刚才写好的自定义Multer配置
  • 顺便在Multer配置里加上两层校验:一是文件类型过滤,只放行jpg、png、webp这类常见图片格式;二是单文件大小限制,比如设为10MB,避免大文件占用上传带宽
  • 接口方法里直接读取挂在文件对象上的Azure公网链接,把链接存入业务数据库即可,全程没有服务器本地磁盘的读写开销

新手容易踩的坑

  • 别选“先把文件传到本地服务器磁盘,再转存到Azure”的方案:平白占用服务器磁盘空间,还容易因为磁盘IO慢导致接口超时,完全没必要
  • 不要装长期不维护的multer-azure这类第三方适配包:很多这类包和最新版本的Multer、Azure SDK存在版本兼容问题,自己写的自定义存储引擎逻辑透明、可控,出问题排查也简单
  • 别把Azure的连接字符串、容器名硬编码在业务代码里:用Nest的ConfigService从环境变量读取配置,避免代码提交时漏泄账号密钥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 06:06:09