使用node.js从表单上载照片

时间:2014-02-13 06:02:23

标签: javascript html node.js parsing post

我对节点很新,需要一些指导和帮助。在我进一步讨论之前,我试图在没有像Express之类的任何其他框架的情况下做到这一点。情况如下:

我有一个表单,用户可以将照片上传到节点中运行的服务器。表单具有以下属性

<form  action="/newImages/" method="post" enctype="multipart/form-data">
    File goes : <input type="file" name="fileName"><br>
    <input type="submit" value="Submit">
</form> 

表单输入由此代码

处理
  if (req.method == 'POST' && req.url == '/newImages/') {
  console.log("Inside Post method");
  var body = ''
  req.on('data', function(data) {
    body += data
  })
  req.on('end', function() {
     var note = querystring.parse(body)
      console.log(note)


      fs.writeFile("./test.jpg",body, function(err){
        if(err)
        {
          console.log(err);
        }
        else
        {
          console.log("The Picture was saved");
        }
      })

     res.writeHead(302, {
    'Content-Type':'text/plain',
    'location':'/index.html'});
    res.end('Found!');

  })
  }

然而,有些东西告诉我,我需要以不同的方式解析数据,因为它的输出是不可读的。看起来像 : “\ n \ r \ n \ u0000的\ u0010JFIF \ u0000的\ U0001 \ U0001 \ U0001 \ u0000的\u0000 \ u0000的\ u0000的\ u0000C \ u0000的\ B \ u0006 \ u0006 \ u0007 \ u0006 \ u0005 \ b \ u0007 \ u0007 \ u0007 \吨\吨\ b \ñ\˚F\ u0014 \ r \˚F\ u000b \ u000b“

有关如何使其发挥作用的任何想法?我还应该注意,我只上传了.jpg。

由于

2 个答案:

答案 0 :(得分:0)

我认为保存照片时你错了。您不需要使用fs.writeFile(),而是使用fs.rename。

这个cose适用于我的app.js:

app.post('/upload', function (req, res) {
    var tempPath = req.files.file.path,
        name = '',
        targetPath = '';

    fileExist = true; 
    fileNumber = 0;

    var fileType = path.extname(req.files.file.name);
    var fileName = path.basename(req.files.file.name,fileType);

    while (fileExist) {

      fileNumber_str = fileNumber.toString(); 

      var current = fileName + "_" +fileNumber_str + fileType;
      console.log("Controllo per "+current);

      if (fs.existsSync(__dirname + "/images/orig/" + current)) {
          console.log("--> Esiste");
          fileNumber++;
      } else {
          var newPath = __dirname + "/images/orig/" + current;
          console.log("nuovo nome : "+newPath);
          fs.rename(tempPath, newPath, function(err) {
                if (err) throw err;
                //Ora creo il thumb
                console.log("Upload completed!");
            });
          break;
      }
    }

    res.redirect("/");
        res.end();    
});

看看。

微米。

答案 1 :(得分:0)

您似乎无法使用querystring.parse解析多部分数据。

您必须编写自己的解析器或使用第三方模块,例如node-multiparty

使用multiparty模块,代码将如下所示:

if (req.method == 'POST' && req.url == '/newImages/') {
  var form = new multiparty.Form();
  form.parse(req, function(err, fields, files) {
    var tmp = files.fileName[0].path;
    fs.rename(tmp, '/your/dir/img.jpg', function(err) {
      if (err) throw err;
      console.log('success');
    });
    res.end('Found!');
 });
}