如何在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
相关产品推荐
相关产品推荐

