21xrx.com
2024-05-20 13:01:03 Monday
登录
文章检索 我的文章 写文章
NodeJS原生文件上传实现
2023-07-09 16:35:03 深夜i     --     --
NodeJS 文件上传 原生实现

NodeJS是一个流行的JavaScript运行时环境,它拥有强大的服务器端功能。在Web开发中,文件上传是一个非常常见的需求,本文将介绍如何使用NodeJS原生实现文件上传。

## 前置知识

在进行NodeJS文件上传之前,您需要对以下知识有一定的了解:

1. 文件上传的HTTP协议

2. NodeJS的HTTP模块

3. NodeJS的文件系统(fs)模块

如果您对上述知识不熟悉,建议先学习相关知识再进行文件上传的实现。

## 代码实现

在本文中,我们将使用NodeJS的HTTP模块与文件系统(fs)模块来实现文件上传。首先,我们需要创建一个HTTP服务器并监听端口:


const http = require('http');

const server = http.createServer();

const port = 3000;

server.listen(port, () => {

 console.log(`Server listening on port ${port}`);

});

接下来,我们需要使用NodeJS的HTTP模块来解析HTTP请求中的文件。对于文件上传请求,常用的方式有两种,分别为multipart/form-data和application/x-www-form-urlencoded。在本文中,我们将使用multipart/form-data的方式。使用NodeJS的HTTP模块解析此类请求可以使用formidable模块(安装方式:`npm install formidable`)

将formidable引入代码中


const http = require('http');

const formidable = require('formidable');

const server = http.createServer();

const port = 3000;

server.listen(port, () => {

 console.log(`Server listening on port ${port}`);

});

使用formidable模块解析表单数据的请求:


server.on('request', (req, res) => {

 if (req.method === 'POST') {

  const form = new formidable.IncomingForm();

  form.parse(req, (err, fields, files) => {

   if (err) {

    console.error(err);

    res.statusCode = 400;

    res.end('Bad Request');

    return;

   }

   console.log(fields, files);

   res.end('File uploaded successfully!');

  });

 }

});

上述代码会在收到POST请求时创建一个formidable对象,并使用parse方法来解析请求中的表单数据。如果解析过程中发生错误,将会返回一个400的状态码和“Bad Request”消息。

如果解析成功,将输出解析出的fields和files,同时返回一个成功上传的消息。

接下来,我们需要使用NodeJS的文件系统(fs)模块来保存上传的文件。在使用formidable的parse方法之后,上传的文件已经保存在了files对象中。


server.on('request', (req, res) => {

 if (req.method === 'POST') {

  const form = new formidable.IncomingForm();

  form.parse(req, (err, fields, files) => {

   if (err) {

    console.error(err);

    res.statusCode = 400;

    res.end('Bad Request');

    return;

   }

   const path = require('path');

   const fs = require('fs');

   const oldPath = files.file.path;

   const newPath = path.join(__dirname, files.file.name);

   fs.rename(oldPath, newPath, () => {

    res.end('File uploaded successfully!');

   });

  });

 }

});

在上述代码中,我们使用require引入了NodeJS的path模块和fs模块,并使用path.join方法生成新文件的完整路径。接下来,我们使用fs模块的rename方法将旧文件的路径改为新文件的路径,实现文件的保存。

## 总结

在本文中,我们介绍了如何使用NodeJS的HTTP模块和文件系统(fs)模块来实现文件上传。如果您需要实现更加完善的文件上传流程,还可以使用其他框架或插件来进一步简化文件上传流程,例如Multer、busboy等。

但是,需要注意的是,文件上传功能存在较大的安全隐患,必须注意防止恶意攻击。在实际使用中,应当严格控制上传文件的类型和大小,并对上传的文件进行合法性验证,以防止非法上传和攻击。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复