从请求文件Express JS获取二进制数据

时间:2016-12-18 15:06:21

标签: node.js

我在客户端有一个表单,上传文件

<form method="post" action="/">
    <input type="file"/>
</form>

如何使用nodeJS和Express在服务器中使用此文件读取数据内容和二进制数据内容?像这样......

app.get('/',(req, res) => {
    //handle data content
    //handle binary data content
}

1 个答案:

答案 0 :(得分:1)

使用ExpressJS中间件,例如multer

注意:以下示例不适用于生产环境。 HTML代码和快速js后端都不使用任何类型的安全性。在生产环境中使用此示例会使您的系统以及您的网络可能受到攻击。

另请注意:我假设您对快速j有一些非常基本的了解,包括如何制作简单的GET和POST路线。

假设我有一个包含这个简单HTML的页面,它允许一个人将任何类型和大小的任何文件上传到我的网站:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Upload file to ExpressJS backend</title>
</head>
<body>
<form enctype="multipart/form-data" action="/do-upload" method="post">
  <input type="file" name="file_from_user"/>
  <input type="submit" value="Submit"/>
</form>
</body>
</html>

<form ...>指定它会以multipart/form-data http请求的形式将/do-upload有效负载上传到我的POST端点。所以,在我的服务器上我需要......

  1. 指定/do-upload端点。
  2. 允许/do-upload端点接受POST http请求。
  3. 允许/do-upload端点接受multipart/form-data
  4. 使用普通的旧快递js路由很容易解决第1和第2项。

    如果我们仅限于表达js,那么困难的部分是第3项。值得庆幸的是,我们没有限制,因此我们将使用multer中间件。 Multer自动知道如何从中获取多部分表单数据和解密文件上传(通过多部分表单数据请求如何上传文件的确切机制是我给你留下的挑战,读者,发现)。

    我们将创建我们的/do-upload路由,向其中注入一个multer中间件实例,然后在有人尝试上传文件时执行某些操作。这是代码:

    var express = require('express'),
      multer = require('multer'),
    
      // Set up the middleware, which automatically handles files uploaded to it.
      // The "dest" property specifies the location to save uploaded files.
      // You will need to make sure this directory exists.
      upload_middleware = multer({dest: 'tmp/uploads/'}),
    
      app = express(),
    
      // This is the name of the <input> element from the HTML that will
      // send the file to the server.
      form_element_name = 'file_from_user';
    
    // The second parameter is how one injects middleware into a route in express js.
    app.post('/do-upload', upload_middleware.single(form_element_name), function (request, response) {
      console.log('Got a file!');
    
      // The multer middleware adds the "file" property 
      // to the request object. The file property contains useful
      // information about the file that was uploaded.
    
      console.log('The original filename was: "%s".', request.file.originalname);
      console.log('I saved the file to: %s.', request.file.path);
      console.log('The file is %s bytes in size.', request.file.size);
    
      // Finish the request with an HTTP 200 code and an informative message, so we don't leave user
      // hanging in his or her browser.
      response
        .status(200)
        .send('File uploaded successfully!');
    });
    
    // ... other routes
    // ... app.listen call that starts your server
    

    让快速js轻松接受单个文件上传,然后在目录中某处隐藏悲伤上传真的很简单。正如我所说,这不是生产准备。它需要安全性,我将这作为一个挑战让你想出来。

    来源和进一步阅读: