【问题标题】:Node JS file transfer via Request Module通过请求模块传输 Node JS 文件
【发布时间】:2017-01-23 18:58:37
【问题描述】:

我正在创建一个节点服务器,可以将文件上传到该节点服务器,然后将其发送到也使用节点的存储服务器。 为此,我正在使用 Form-Data 模块页面上描述的这种方法:

var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});

我的问题是,当我尝试在存储服务器上写入文件时,它会创建一个包含内容 [object Object] 的文本文件。

这是我的代码:

main.js

var form = new formData();
form = {
        'oldFileName': oldName,
        'newFileName': newName,
        'file': fs.createReadStream(FILEPATH),
    };

    request.post({url:'http://127.0.0.1:9001/upload', form: form}, function(err, httpResponse, body) {
        if (err) {
            return console.error('upload failed:', err);
        }
    });

storage.js

app.post('/upload', function(req,res){
    //Filenames are displayed without problem
    console.log(req.body.newFileName);
    console.log(req.body.oldFileName);

    fs.writeFile('./testing/' + req.body.newFileName, req.body.file, function(err) {
    if(err) {
        return console.log(err);
    }
})

我确定我遗漏了一些非常明显的东西,但我似乎无法让它发挥作用。

【问题讨论】:

  • 我认为你必须使用multer 或类似的库来接受multipart/form-data in storage.js
  • 我试过了(很抱歉应该提到它),但multer 似乎无法识别构造表单中的文件

标签: javascript node.js forms request


【解决方案1】:

您在requestform 选项中传递formData,该选项将内容更改为application/x-www-form-urlencoded 而不是multipart/form-data

app.js

var form = {
    'oldFileName': oldName,
    'newFileName': newName,
    'file': fs.createReadStream(FILEPATH),
};

request.post({url:'http://127.0.0.1:9001/upload', formData: form}, function(err, httpResponse, body) {
    if (err) {
        return console.error('upload failed:', err);
    }
});

另外,要解析multipart/form-data,您必须使用multer 或类似的库,body-parser 在这种情况下不起作用。请找到以下用于保存文件的工作storage.js 代码。

storage.js

  var multer  = require('multer')
  var upload = multer({
     storage: multer.diskStorage({
        destination: function (req, file, cb) {
          cb(null, './testing/');
        },
        filename: function (req, file, cb) {
          cb(null, req.body.newFileName);
        }
     })
  }).single('file');

 app.post('/upload', function(req, res, next){
    upload(req, res, function (err) {
        if(err){
          return res.send(err);
        } else{
          return res.send("Upload successfully");
        }
    });
 });

希望对你有帮助。

【讨论】:

    【解决方案2】:

    或者,将 [object Object] 包装在 JSON.stringify() 方法中应该会显示对象的文字字符串内容。

    在我的情况下,我使用 NodeJS 库来上传 YouTube 视频,遵循 OAuth2.0 协议。

    在此标准中,您发布您的客户端 ID 和客户端密码以验证您对 YouTube 数据 API 的使用。

    作为回报,服务器以访问令牌和刷新令牌的形式返回令牌。这些令牌需要刷新才能使用 API 而不会过期。

    但是,当我请求“令牌”时,我在终端中收到了 (Object, object)....

    Logger.log(Got the tokens:(token));

    为了纠正问题并以可读的字符串格式显示终端中的令牌,我执行了以下操作...

    Logger.log(Got the tokens: ${JSON.stringify(token)});

    现在我可以相应地使用令牌。

    //注意 - ES6 反引号用作字符串文字,但反引号似乎没有显示在参数中。

    【讨论】:

    • 为什么不包括一个sn-p代码和相关的输出来证明这一点?
    • 是的,当然,我已经编辑了答案以包含更多信息。
    猜你喜欢
    • 2018-10-03
    • 2016-10-27
    • 2018-09-11
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多