【问题标题】:Uploading files to S3 using node.js使用 node.js 将文件上传到 S3
【发布时间】:2016-06-23 08:55:09
【问题描述】:

我正在创建一个门户,用户可以在其中选择单个文件并将其从他们的 PC 上传到 AWS 上的 S3。

下面是我的 server.js 代码:

app.post('/submit_doc', function(req, res){

var FileName = req.body.fileName,
Filedescription = req.body.filediscrip,
InputFileName = req.body.inputfile;
AWS.config.region = 'eu-west-1';
var fileStream = fs.createReadStream(FileName);
fileStream.on('error', function (err) {
    if (err){
        console.log("Error reading file: ", err);
        res.send(500);
    }
    else{
        fileStream.on('open', function () {
            var s3 = new AWS.S3();
            s3.putObject({
                Bucket: 'exampleassetcare.com',
                Key: 'reports/'+FileName,
                Body: fileStream
             }, function (err) {
             if (err) { 
                 console.log("Error uploading data: ", err);
                 res.send(500);
             }
         });
     });

我收到错误:没有这样的文件或目录。

有人可以帮忙吗?

【问题讨论】:

    标签: node.js file amazon-s3 upload


    【解决方案1】:

    如果我对您的理解正确,您发布的这段代码正在服务器上运行。但是输入是由 client 提供的,是吗?如果是这样,您的服务器将尝试根据客户端为您提供的文件路径在本地查找文件...因此该文件将不存在...

    如果我是一个恶意用户并且我告诉你的服务器上传一个文件路径/etc/passwd,你的服务器会暴露散列密码(假设它是一个 Linux 系统,并假设有适当的权限,等等。 . 但你明白了)。

    【讨论】:

    • 是的,代码在服务器中,而输入来自客户端。那么如何处理这个上传呢?
    • 您使用的是 Express 吗?如果您是,请查看stackoverflow.com/questions/23114374/…。简而言之,您需要在客户端有一个将 POST 数据发送到服务器的 HTML 表单。在该数据中,您的服务器可以在本地缓冲然后上传到 S3 的文件内容,或者直接流式传输到 S3。有意义吗?
    • 是的,这很有帮助。我需要安装一些中间件来处理从客户端(带有 POST 方法的 HTML)到 S3(Express 上的 Nodejs)的文件上传。
    • 是的,这听起来很对。我将分步处理它:(1)让您的 HTML 表单向您的 Node.js 服务器发布请求; (2) 吐出在您的on("data") 事件期间收到的字节; (3) 将一个小文件完整上传到S3; (4) 更改为处理大文件的流式处理方法....虽然如果您只上传小文件,例如最大 MB 文本文件,在低请求服务器上,您可能只需要缓冲就可以逃脱将您服务器上的数据一次性上传到 S3。
    • 感谢您的进一步解释。同时,我发现AWS SDK for browser中有上传功能。这正是我想要的,但在服务器端。感谢 pyepe 的澄清。
    【解决方案2】:

    改成

    var FileName = req.body.fileName,
    Filedescription = req.body.filediscrip,
    InputFileName = req.body.inputfile;
    AWS.config.region = 'eu-west-1';
    console.log(FileName)
    var fileStream = fs.createReadStream(FileName);
    

    并检查您的文件是否存在,看起来文件路径有问题。

    【讨论】:

    • 文件名显示正确。正如 pyepye 提到的,我正在尝试将本地文件上传到 S3。所以服务器应该访问本地文件路径。
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2016-02-06
    • 2017-10-18
    • 2017-12-06
    相关资源
    最近更新 更多