使用nodeJS上传时,文件被破坏

这是我的服务器代码

app.post('/tde/api/photo/:widgetId/:choosenFileName',function(req,res){ console.log("In file Upload.."); console.log(req.params.widgetId); console.log(req.params.choosenFileName); res.writeHead(200, { 'Content-Type': 'application/binary' }); var filedata = ''; req.setEncoding('binary'); req.on('data', function(chunk){ filedata+= chunk; }) req.on('end', function (chunk) { var dir = 'uploads/'+req.params.widgetId if (!fs.existsSync(dir)){ fs.mkdirSync(dir); console.log("directory created.."); } var fileName = req.params.choosenFileName; var widgetId = req.params.widgetId; fs.writeFile('uploads/'+widgetId+'/'+fileName, filedata, 'binary', function(err) { if (err) { return console.error(err); } }) }); res.end("File is uploaded"); 

})

这是我的客户端代码。 这是我的HTML文件,它允许用户select一个文件,然后将其上传到服务器位置

  <div class="col-xs-8"> 

上传图片

  <span class="warn_msg" ng-if="warningModalWidgetSettingsURLMessage1 != ''"><i class="glyphicon glyphicon-remove-circle"></i> {{warningModalWidgetSettingsURLMessage1}} </span> </div> This is my js file which calls the api of nodejs server $scope.widgetForm.imageConfig = {}; var imageLocationUrl = "http://10.100.10.140/opt/TDE/tde_v2.0-19-01-2016Sanmoy/uploads/" var imageWidgetId = ""; var choosenFileName = ""; $scope.submitFile = function(widgetId){ imageWidgetId = widgetId console.log($scope.fileImage)//this is the file name which I a choosenFileName = $scope.fileImage.name $http({ url: "http://10.100.10.140:9001/tde/api/photo/"+widgetId+"/"+choosenFileName, method: "POST", headers: { 'Content-Type': 'application/binary' }, data: $scope.fileImage, processData: false, contentType: false }).success(function(data, status) { console.log("File Uploaded..") }).error(function(data, status) { console.log("File Upload fail..") }) } 

文件正在上传到服务器,但有时会被损坏,无法理解问题出在哪里。

看起来你每次上传完成时都会覆盖“uploads / report.jpg”,这可能会在多次上传的同时造成损坏:

 function(err) { var fileName = req.params.choosenFileName; var widgetId = req.params.widgetId; fs.writeFile('uploads/report.jpg', chunk, function(err) { if (err) { return console.error(err); } }) 

怎么样的评论线:

 //fs.writeFile('uploads/'+req.params.widgetId+'/sanmoy.jpg', chunk, 

这样做可能会更好:

 fs.writeFile('uploads/'+req.params.widgetId+'/'+fileName', chunk, 

请注意,仍然可以用相同的'fileName'上传两个或多个文件,所以添加某种前缀或后缀可能会更好。

更新1:

我只注意到你只保存了第一个块。 数据可能适合一个块,但也可能由多个块组成。 尝试这样的事情:

 var filedata = ''; req.setEncoding('binary'); req.on('data', function(chunk){ filedata+= chunk; }) req.on('end', function(){ // create directory etc. fs.writeFile('uploads/'+req.params.widgetId+'/'+fileName, filedata, 'binary', function(err){ if (err) { return console.error(err); }) })