文件下载在Nodejs中提供损坏的文件

时间:2015-11-18 19:59:38

标签: node.js amazon-web-services amazon-s3

我在NodeJS中使用请求模块从AWS S3读取数据。当我使用下面的代码下载文件(docx或图像或pdf)时,它给我一个无效/损坏的文件。但是当我下载.txt文件时,它没有被破坏,我能够在记事本中看到文件。

我做了一些谷歌搜索,并建议也尝试将编码设置为二进制,仍然没有给出所需的结果。

文件上传工作正常。我可以在AWS控制台中看到上传的文件。

文件下载代码

int

更新: - 我已经缩小了错误,只是尝试通过从本地文件系统读取文件来发送文件。即便如此,也会在客户端上提供损坏的文件。 这是相同的代码

var s3 = new properties.AWS.S3();
    var params = {Bucket: properties.AWS_BUCKET, Key: req.headers['x-org'] + "/" + "talk" + "/" + req.body.fileName};
    s3.getSignedUrl('getObject', params, function (err, URL) {
        if (err) {
            console.log("Error inside the S3");
            console.log(err, err.stack); // an error occurred
            res.send(null);
        } else {
            console.log("After getObject:-" + URL);
            request({
                url: URL, //URL to hit
                method: 'GET',
                encoding: 'binary'
            }, function (error, response, body) {
                if (error) {
                    console.log(error);
                } else {
                    //console.log(response.statusCode, body);
                    res.set('content-disposition', 'attachment; filename=' + req.body.fileName);
                    res.send(body);
                }
            });
        }
    });

1 个答案:

答案 0 :(得分:2)

终于能够解决问题了。

从此博客https://templth.wordpress.com/2014/11/21/handle-downloads-with-angular/获得解决方案提示。

根据此博客

  

使用zip文件或图像等二进制内容进行测试时,我们会看到   下载的内容已损坏。这是因为   Angular会自动对接收的数据应用转换。   处理二进制内容时,我们希望将它们作为数组缓冲区。

最终工作代码是: -

var filePath = path.join(__dirname, '..', '..', '..', 'downloads', req.body.fileURL);
    var file = fs.createWriteStream(filePath);
    s3.getObject(params).
    on('httpData', function(chunk) { 
        //console.log("inside httpData");
        file.write(chunk); 
    }).
    on('httpDone', function() { 
        console.log("inside httpDone");
        file.end(); 
        //file.pipe(res);
    }).
    send(function() { 
        console.log("inside send");
        res.setHeader('Content-disposition', 'attachment; filename=' + filePath);
        res.setHeader('Content-type', mimetype);
        res.setHeader('Transfer-Encoding', 'chunked');
        var filestream = fs.createReadStream(filePath);
        filestream.pipe(res);
    });