【问题标题】:File is getting corrupted while uploading using nodeJS使用 nodeJS 上传时文件损坏
【发布时间】:2016-05-12 13:15:58
【问题描述】:

这是我的服务器代码

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 文件,它允许用户选择一个文件,然后将其上传到服务器位置

    <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..")
        })
    }

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

【问题讨论】:

    标签: javascript html angularjs node.js


    【解决方案1】:

    您似乎在每次上传完成时都会覆盖“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, 
    

    请注意,仍然可以上传两个或多个具有相同“文件名”的文件,因此添加某种前缀或后缀可能会更好。

    更新 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);
        })
    })
    

    【讨论】:

    • 我也完成了这个 fs.writeFile('uploads/'+req.params.widgetId+'/'+fileName', chunk 但它仍然被破坏了
    • 请查看“更新 1”。
    • 那么您能发布您的更新代码吗?谢谢。
    • 也许这个例子也值得一试:stackoverflow.com/a/26748991/5876813
    • 所有上传的文件都损坏了吗?如果没有,您能否列出上传文件的示例(正常/损坏),包括。他们的尺寸?
    猜你喜欢
    • 2020-01-29
    • 2020-09-27
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2020-04-05
    • 2014-02-25
    相关资源
    最近更新 更多