使用Multer+Express上传文件损坏问题求助(Windows Server环境)
解决Windows Server 2008 R2上multer上传文件损坏的问题
我之前也碰到过类似在Windows Server环境下multer上传文件损坏的情况,结合你的代码和场景,首先能看到一个非常明显的问题——你在路由处理中重复调用了cpUpload。
你已经把cpUpload作为app.post的中间件使用了,却又在回调函数里再次调用cpUpload(req,res,function(err){...}),这会导致multer两次尝试处理同一个上传请求,直接破坏了文件的写入流程,这大概率就是文件损坏的核心原因。
修正后的服务器代码
把重复调用的逻辑去掉,调整后的代码如下:
var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './files/') }, filename: function (req, file, cb) { crypto.pseudoRandomBytes(16, function (err, raw) { cb(null, raw.toString('hex') + Date.now() + '.xsd'); }); } }); var cpUpload = multer({ storage: storage, limits: {fileSize: 1000000} }).single('schema-file'); var app = express(); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS'); next(); }); app.post('/ws-api-designer-upload-files', cpUpload, function (req, res, next) { console.log("filepath " + req.file.filename); // 直接通过req对象获取错误或文件信息,无需重复调用cpUpload if (req.fileValidationError) { res.set('Content-Type', 'application/json'); res.end(JSON.stringify({ status: 'ERROR 1', description: req.fileValidationError })); return; } else if (!req.file) { res.set('Content-Type', 'application/json'); res.end(JSON.stringify({ status: 'ERROR 1', description: 'No file uploaded' })); return; } else { res.set('Content-Type', 'application/json'); res.end(JSON.stringify({ status: 'SUCCESS 1', description: 'success' })); return; } });
额外排查方向(如果修正后仍有问题)
- 检查目录权限与存在性:确保Windows Server 2008 R2上的
./files/目录存在,并且Node.js进程拥有写入权限。可以在代码里添加自动创建目录的逻辑:const fs = require('fs'); const uploadDir = './files/'; if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } - 路径兼容性优化:Windows系统的路径分隔符是
\,建议用path.join构建路径,避免解析异常:const path = require('path'); destination: function (req, file, cb) { cb(null, path.join(__dirname, 'files')) }, - 临时移除大小限制测试:虽然你的
fileSize设置(约976KB)远大于173KB的目标文件,但可以暂时注释limits配置,排查是否存在系统层面的文件截断问题。
内容的提问来源于stack exchange,提问作者dityagow
相关产品推荐
相关产品推荐

