如何将Serverless Offline接收的表单视频Buffer保存到磁盘?
嘿,看起来你已经搞定了最麻烦的表单解析部分,剩下的把Buffer存成视频文件其实很简单!我来给你一步步说清楚怎么在Node.js的Serverless Offline环境里实现这个功能:
核心思路
用Node.js内置的fs文件系统模块,直接把Buffer写入磁盘就行——不过要注意Serverless环境的路径和权限问题,我会给你踩好坑。
具体实现步骤
1. 引入依赖模块
首先你需要用到fs(推荐用promise版本,避免回调地狱)和path来处理文件路径:
const fs = require('fs').promises; const path = require('path');
2. 封装保存文件的异步函数
写一个通用的函数来处理Buffer写入,还能自动创建不存在的目录:
async function saveVideoBufferToDisk(videoBuffer, targetFilePath) { try { // 先确保目标目录存在,recursive: true会自动创建所有父目录 const targetDir = path.dirname(targetFilePath); await fs.mkdir(targetDir, { recursive: true }); // 将Buffer写入文件 await fs.writeFile(targetFilePath, videoBuffer); console.log(`视频已成功保存到: ${targetFilePath}`); } catch (error) { console.error('保存文件时出错:', error); throw error; // 抛出错误让上层handler处理 } }
3. 在Serverless Handler里调用这个函数
假设你已经把请求事件解析成了包含Buffer的JSON对象,比如Buffer存在parsedData.videoBuffer字段里,那在你的handler里这么用:
module.exports.upload = async (event) => { // 这里替换成你实际解析请求的逻辑 const parsedRequestData = JSON.parse(event.body); const videoBuffer = parsedRequestData.videoBuffer; // 你的Buffer字段名 // 指定保存路径——比如项目根目录下的uploads文件夹,文件名可以用原上传文件名 // 如果你在Angular上传时传了原文件名,这里可以直接用它,比如parsedRequestData.fileName const outputPath = path.join(__dirname, 'uploads', 'my-uploaded-video.mp4'); try { await saveVideoBufferToDisk(videoBuffer, outputPath); return { statusCode: 200, body: JSON.stringify({ message: '文件保存成功' }) }; } catch (error) { return { statusCode: 500, body: JSON.stringify({ error: '文件保存失败', details: error.message }) }; } };
关键注意事项
- 如果Buffer是Base64字符串:有时候解析后的Buffer可能会变成Base64编码的字符串(比如JSON序列化后),这时候你需要先转成Buffer:
const videoBuffer = Buffer.from(parsedRequestData.videoBuffer, 'base64'); - 文件名优化:建议从前端传原文件名过来,比如在Angular的
ng2-file-upload里,你可以在构建表单时把文件名加进去:
这样后端就能用这个文件名来保存,更合理。uploader.onBuildItemForm = (fileItem, form: FormData) => { form.append('fileName', fileItem.file.name); // 把原文件名传给后端 return form; }; - Serverless Offline权限:确保你的项目目录有写入权限,
uploads目录如果不存在,上面的代码会自动创建,不用手动提前建。 - Buffer完整性检查:可以打印
videoBuffer.length看看大小是否和原视频文件一致,确保解析过程中没有损坏数据。
内容的提问来源于stack exchange,提问作者Tutch
相关产品推荐
相关产品推荐

