【问题标题】:File download giving corrupt file in Nodejs文件下载在Nodejs中给出损坏的文件
【发布时间】:2015-11-19 13:33:21
【问题描述】:

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

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

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

文件下载代码

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

更新:- 我缩小了错误范围,只是尝试通过从本地文件系统读取文件来发送文件。即使这样也给客户端上损坏的文件。 这是相同的代码

var filePath = path.join(__dirname, '..', '..', '..', 'downloads', req.body.fileURL);
    var stat = fs.statSync(filePath);
    var filename = path.basename(filePath);
    var mimetype = mime.lookup(filePath);
    console.log("mimetype=" + mimetype);

    res.setHeader('Content-disposition', 'attachment; filename=' + filename);
    res.setHeader('Content-type', mimetype + ";charset=UTF-8");
    res.setHeader('Content-Length', stat.size);
    var filestream = fs.createReadStream(filePath);
    filestream.pipe(res);

【问题讨论】:

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


    【解决方案1】:

    终于可以解决问题了。

    从这个博客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);
        });
    

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2015-07-14
      • 2015-07-16
      • 2017-12-04
      • 2019-01-28
      • 1970-01-01
      相关资源
      最近更新 更多