在现代网络开发中,文件上传是一个常见的需求。随着Node.js的兴起,开发者们开始寻找一种更简洁、更高效的文件上传解决方案。本文将介绍如何利用Node.js、Express框架以及Multer中间件来实现文件上传功能。
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript能够在服务器端运行。Node.js支持跨平台,并且具有丰富的模块生态系统。Node.js应用程序完全使用JavaScript编写,这为开发者提供了一种统一的编程语言来处理前端和后端的代码。
首先,需要创建一个空白的Node.js Web应用程序。这可以通过Node.js的包管理器npm来完成。在创建应用程序后,将设置必要的依赖项。
在package.json文件中,将添加Express、Multer和body-parser作为依赖项。这些依赖项将帮助构建Web服务器和处理文件上传。
{
"name": "node_js_file_upload",
"version": "0.0.1",
"description": "Node_JS_File_Upload",
"main": "server.js",
"dependencies": {
"body-parser": "^1.15.2",
"express": "^4.14.0",
"multer": "^1.2.0"
},
"author": {
"name": "Sibeesh"
}
}
接下来,运行npm install命令来安装这些依赖项。
Express是一个灵活的Node.js Web应用框架,它提供了一套基础的Web应用功能,同时保留了Node.js的核心特性。Multer是一个用于处理multipart/form-data的Node.js中间件,主要用于文件上传。body-parser是一个用于解析请求体的中间件,它支持多种格式,包括JSON和urlencoded。
将创建Express、Multer和body-parser的实例,并设置文件存储的位置和方式。
const express = require('express');
const multer = require('multer');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
// 设置文件存储
const storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './Images');
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '_' + Date.now() + '_' + file.originalname);
}
});
在这里,定义了一个diskStorage对象,它指定了文件的存储位置和文件名的生成方式。
接下来,将创建一个Multer对象,它将使用之前定义的存储配置。
const upload = multer({ storage: storage }).array('imgUploader', 3);
这里,指定了字段名和文件的最大数量。
将设置GET和POST路由,以便处理文件上传请求。
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
app.post('/api/Upload', function (req, res) {
upload(req, res, function (err) {
if (err) {
return res.end('Something went wrong!');
}
return res.end('File uploaded successfully!');
});
});
在这里,定义了根路径的GET请求,它将发送index.html文件。还定义了一个POST请求,它将处理文件上传。
将创建一个HTML页面,它将包含一个文件上传表单。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8"/>
<title>使用Node.js上传图片</title>
<script src="Scripts/jquery-3.1.1.min.js"></script>
<script src="Scripts/jquery.form.min.js"></script>
</head>
<body>
<form id="frmUploader" enctype="multipart/form-data" action="api/Upload" method="post">
<input type="file" name="imgUploader" multiple />
<input type="submit" name="submit" id="btnSubmit" value="Upload"/>
</form>
</body>
</html>
在这个HTML页面中,定义了一个表单,它将使用multipart/form-data编码类型,并将action属性设置为API路径。
最后,将创建一个Ajax事件,它将调用API。
<script>
$(document).ready(function () {
var options = {
beforeSubmit: showRequest,
success: showResponse
};
$('#frmUploader').submit(function () {
$(this).ajaxSubmit(options);
return false;
});
function showRequest(formData, jqForm, options) {
alert('Uploading is starting.');
return true;
}
function showResponse(responseText, statusText, xhr, $form) {
alert('status: ' + statusText + '\n\nresponseText: \n' + responseText);
}
});
</script>
在这里,定义了beforeSubmit和success回调函数,它们将在文件上传前后执行。
现在,可以运行应用程序。在运行之前,可以将脚本文件设置为启动文件。然后,可以打开命令提示符,运行node server.js命令来启动服务器。