【问题标题】:Upload a chunked image file issue上传分块图像文件问题
【发布时间】:2017-10-06 08:41:49
【问题描述】:

我正在使用ng-file-upload 指令从我的角度应用程序向服务器发送图像。这是我的代码:

Upload.upload({
    url: 'http://localhost:5000/upload',
    data: { file: blobFile },
    resumeChunkSize: 10000,
}).then(function (resp) { //upload function returns a promise
    console.log('resp: ', resp);
});

图像正在分块传输。但现在,我被打动了。我不知道如何接收这些块并合并以创建完整图像。我的服务器代码如下:

handler: function (req, res) {
    var size = 0;

    req.on('data', function (data) {
      size += data.length;
      console.log('Got chunk: ' + data.length + ' total: ' + size);
    });

    req.on('end', function () {
      console.log("total size = " + size);
      res.send("response");
    });

    req.on('error', function (e) {
      console.log("ERROR ERROR: " + e.message);
    });
  }

每次,我都会收到一个块请求,req.on('end', ...) 触发。我是新手,在这里很困惑。

【问题讨论】:

    标签: javascript angularjs node.js ng-file-upload http-chunked


    【解决方案1】:

    是的.. 一个分块的图片上传不是那么简单...

    这是我使用的解决方案:

    var request = require('request');
    var fs = require('fs');
    
    function uploadChunkedImage(url, callback){
    
        // request options
        var options = {  
            url: url, // the url of the image
            method: 'GET'
        };
    
        // array of chunks
        var chunks = [];
    
        // request
        request(options, function (err, res, body) {
            console.log('END')
    
            // body is corrupted, you can't use it for images... :-(
            // so, we will callback the concactened buffer of it instead
    
            // concact chunk buffers
            chunks = Buffer.concat(chunks); // image buffer that you can use
    
            // callback the result
            callback(err, res, chunks);
    
        }).on('response', function (response) {
    
            response.on('data', function (chunk) {
                // collect chunk buffer
                chunks.push(chunk);
            });
    
        });
    }
    
    uploadChunkedImage('http://localhost:5000/upload', function(err, res, buffer){
        if(!err){
             // save
             fs.writeFile('./myDirPath/image.jpg', buffer);
        }else{
             console.log(err);
        }
    
    });
    

    别忘了用npm在你的项目中安装requestfsBuffer是原生的

     npm install request --save
     npm install fs --save
    

    更多信息:

    你可以用 ng-file-upload 做同样的把戏,有一个 good example right here,否则我建议尝试类似下面的方法 (未测试)

    handler: function (req, res) {
    
        // array of chunks
        var chunks= [];
    
        req.on('data', function (data) {
    
          // collect
          chunks.push(data);
          console.log('Got chunk: ' + data.length);
    
        });
    
        req.on('end', function () {
    
          // concact
          chunks = Buffer.concat(chunks);
          console.log("Total size = " + chunks.length);
    
          // res.send() is deprecated, use res.write instead
          res.write(chunks,'binary');
          res.end(null, 'binary');
    
        });
    
        req.on('error', function (e) {
          console.log("ERROR ERROR: " + e.message);
        });
    }
    

    希望对你有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2013-10-12
      • 2021-08-28
      • 1970-01-01
      • 2011-10-27
      • 2023-03-09
      • 2021-01-01
      相关资源
      最近更新 更多