Node.js - 上传文件:初学者指南

你好啊,未来的编程超级巨星!欢迎来到使用Node.js进行文件上传的激动人心的旅程。作为你友好邻里的计算机老师,我非常兴奋能引导你完成这次冒险。如果你之前从未编写过一行代码,也不用担心——我们将从零开始,逐步构建。在本教程结束时,你将能够像专业人士一样上传文件!

Node.js - Upload Files

Node.js中文件上传简介

在我们深入了解之前,让我们先谈谈为什么文件上传很重要。想象一下,你正在创建一个社交媒体应用,用户可以在其中分享照片。或者你可能正在为一家公司构建文档管理系统。在这两种情况下,你都需要一种方法让用户将文件发送到你的服务器。这就是文件上传的用武之地!

我们可靠的JavaScript运行时环境Node.js提供了多种处理文件上传的方法。今天,我们将关注两个流行的库:Formidable和Multer。可以把它们想象成你的文件上传超级英雄,每个都有自己独特的超能力!

Formidable:你的第一个文件上传助手

Formidable是什么?

Formidable就像那个总是愿意帮你搬家可靠的朋友。它是一个Node.js模块,使得解析表单数据(尤其是文件上传)变得轻而易举。让我们看看如何使用它!

设置Formidable

首先,我们需要安装Formidable。打开你的终端并输入:

npm install formidable

这个命令就像去超级英雄商店买你的Formidable装备一样。现在你准备好开始上传了!

使用Formidable进行基本文件上传

让我们创建一个可以处理文件上传的简单服务器。以下是代码:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
res.write('文件已上传并移动!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);

让我们分解一下:

  1. 我们使用http.createServer()创建一个服务器。
  2. 如果URL是'/fileupload',我们使用Formidable来解析传入的表单。
  3. 我们将上传的文件从临时位置移动到永久位置。
  4. 如果URL是其他任何内容,我们显示一个简单的上传表单。

处理多文件上传

如果你想要一次上传多个文件呢?没问题!以下是修改后的代码:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.multiples = true;
form.parse(req, (err, fields, files) => {
if (Array.isArray(files.filetoupload)) {
files.filetoupload.forEach((file) => {
const oldPath = file.filepath;
const newPath = 'C:/Users/YourName/uploads/' + file.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
});
} else {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
}
res.write('文件已上传并移动!');
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload" multiple><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);

这里的关键变化是:

  1. 我们设置form.multiples = true以允许多文件上传。
  2. 我们检查files.filetoupload是否为数组(多文件)或对象(单个文件)。
  3. 如果是数组,我们使用forEach来处理多个文件。

Multer:新来的孩子

Multer简介

现在,让我们见见我们的第二个文件上传超级英雄:Multer。Multer就像Formidable的更酷、更年轻的兄弟姐妹。它专门设计用来处理multipart/form-data,这对于文件上传来说非常完美。

设置Multer

要开始使用Multer,使用npm进行安装:

npm install multer

使用Multer进行基本文件上传

以下是如何使用Multer的简单示例:

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();

const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
});

const upload = multer({ storage: storage });

app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});

app.post('/upload', upload.single('filetoupload'), (req, res, next) => {
const file = req.file;
if (!file) {
const error = new Error('请上传一个文件');
error.httpStatusCode = 400;
return next(error);
}
res.send(file);
});

app.listen(3000, () => console.log('服务器已启动,监听端口3000'));

让我们分解一下:

  1. 我们设置了一个存储引擎,告诉Multer存储文件的位置以及如何命名它们。
  2. 我们使用我们的存储设置创建一个上传实例。
  3. 我们定义了表单上传路由和处理文件上传的路由。
  4. 在上传路由中,我们使用upload.single('filetoupload')来处理单个文件上传。

使用Multer进行多文件上传

Multer使得处理多文件上传变得非常简单。以下是方法:

app.post('/upload', upload.array('filetoupload', 12), (req, res, next) => {
const files = req.files;
if (!files) {
const error = new Error('请选择文件');
error.httpStatusCode = 400;
return next(error);
}
res.send(files);
});

这里的关键变化是使用upload.array('filetoupload', 12)代替upload.single()。'12'指定了最多12个文件。

Formidable与Multer比较

现在我们已经看到了Formidable和Multer的实际应用,让我们比较一下它们:

特性 Formidable Multer
易用性 简单直观 需要更多设置,但提供更多控制
集成 与任何Node.js服务器兼容 为与Express配合而设计
文件处理 可以处理文件和字段 专为文件上传设计
定制性 较不灵活 高度可定制
多文件上传 需要额外代码 内置支持

结论

恭喜你!你刚刚通过学习如何处理文件上传,提升了自己的Node.js技能。无论你选择Formidable的简单性还是Multer的力量和灵活性,你现在都有能力为你的Node.js应用程序添加文件上传功能。

记住,熟能生巧。尝试构建一个使用文件上传的小项目——也许是一个简单的图片分享应用或者文档存储系统。你编写的代码越多,你对这些概念就会越熟悉。

快乐编码,愿你的上传总是成功!

Credits: Image by storyset