0

0

存储用户上传图片到服务器的Node.js教程

碧海醫心

碧海醫心

发布时间:2025-12-05 11:44:02

|

555人浏览过

|

来源于php中文网

原创

存储用户上传图片到服务器的Node.js教程

本教程详细介绍了如何在node.js express应用中处理html文件输入并将其存储到服务器本地。核心方法包括在前端使用`enctype="multipart/form-data"`属性确保文件数据正确发送,以及在后端利用`express-fileupload`中间件解析上传的文件,并通过其提供的`mv()`方法安全高效地将文件移动到服务器指定目录,从而实现完整的图片上传和存储流程。

1. 理解文件上传机制

在Web开发中,处理用户上传的文件(如图片)与处理普通表单数据有所不同。传统的application/x-www-form-urlencoded或application/json编码方式不适用于二进制文件数据。为了正确传输文件,我们需要采取特定的前端和后端配置。

2. 前端HTML表单配置

要允许用户上传文件,HTML

标签必须设置 enctype="multipart/form-data" 属性。这个属性告诉浏览器将表单数据编码为一系列部分,其中每个部分代表一个表单字段或一个文件。

以下是一个简单的HTML表单示例,用于上传图片:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片上传</title>
</head>
<body>
    <h1>上传新菜品图片</h1>
    <form action="/dish/new" method="POST" enctype="multipart/form-data">
        <label for="name">菜品名称:</label>
        <input type="text" name="name" id="name" required><br><br>

        <label for="desc">菜品描述:</label>
        <textarea name="desc" id="desc"></textarea><br><br>

        <label for="cost">价格:</label>
        <input type="number" name="cost" id="cost" required><br><br>

        <label for="isnonveg">是否非素:</label>
        <input type="checkbox" name="isnonveg" id="isnonveg"><br><br>

        <label for="image-input">选择图片:</label>
        <input
            type="file"
            name="thumbnail"
            id="image-input"
            accept="image/png, image/jpg, image/jpeg"
            required
        /><br><br>

        <button type="submit">提交</button>
    </form>
</body>
</html>

关键点:

  • enctype="multipart/form-data":这是处理文件上传的必需属性。
  • input type="file":用于选择文件的输入字段。
  • name="thumbnail":这个name属性在后端用于识别上传的文件。
  • accept="image/png, image/jpg, image/jpeg":限制用户只能选择指定类型的图片文件。

3. 后端Node.js Express配置

在Node.js Express应用中,默认的req.body对象只能解析普通的文本表单数据,无法直接处理multipart/form-data编码的文件内容。为了解析上传的文件,我们需要使用一个专门的中间件。express-fileupload是一个常用且功能强大的选择。

网络工作室源码1.0
网络工作室源码1.0

网络工作室源码基于热腾CMS(RTCMS)定制,栏目全站自动调用,可设置生成为html静态文件。网站分类适合网络公司和工作室使用。程序中带有演示数据,如果全新安装,可将根目录下的/uploads 文件夹中的演示图片文件删掉。安装方式:上传upload_install中的文件上传到虚拟主机或服务器网站根目录下;访问 http://域名/ 即可安装,安装时可以选取“演示数据&

下载

3.1 安装 express-fileupload

首先,在你的项目中安装 express-fileupload:

npm install express-fileupload

3.2 集成 express-fileupload 中间件

在你的Express应用主文件(通常是app.js或server.js)中,引入并注册express-fileupload中间件。

const express = require('express');
const fileupload = require('express-fileupload'); // 引入 express-fileupload
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;

// 配置 Express 中间件
app.use(express.json()); // 用于解析 JSON 格式的请求体
app.use(express.urlencoded({ extended: true })); // 用于解析 URL-encoded 格式的请求体

// 注册 express-fileupload 中间件
// 可以传入配置对象,例如限制文件大小、允许的扩展名等
app.use(fileupload({
    limits: { fileSize: 50 * 1024 * 1024 }, // 限制文件大小为 50MB
    abortOnLimit: true, // 达到限制时中止请求
    useTempFiles: true, // 使用临时文件存储上传的文件
    tempFileDir: '/tmp/' // 临时文件存放目录
}));

// 静态文件服务 (如果需要访问上传的图片)
app.use('/public', express.static(path.join(__dirname, 'public')));

// 启动服务器
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

// ... 其他路由定义

3.3 处理文件上传路由

在你的路由文件中,你可以通过 req.files 对象访问上传的文件。req.files 是一个对象,其键是你在前端HTML input type="file" 标签中定义的 name 属性(例如 thumbnail)。

const express = require('express');
const router = express.Router();
const path = require('path');
const fs = require('fs'); // 用于检查目录是否存在

// 确保目标目录存在
const uploadDir = path.join(__dirname, '../public/images/dishes');
if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
}

router.post('/dish/new', async (req, res) => {
    try {
        // 获取普通表单字段
        let { name, desc, cost, isnonveg } = req.body;
        isnonveg = isnonveg === 'on' ? true : false; // 处理checkbox值

        // 检查是否有文件上传
        if (!req.files || Object.keys(req.files).length === 0) {
            return res.status(400).send('没有上传文件。');
        }

        // 获取上传的文件,`thumbnail` 是前端 input 标签的 name 属性
        let uploadedImage = req.files.thumbnail;

        // 生成唯一的文件名,以避免覆盖现有文件
        const uniqueFileName = `${Date.now()}-${uploadedImage.name}`;
        const targetPath = path.join(uploadDir, uniqueFileName);

        // 使用 mv() 方法将文件从临时位置移动到目标位置
        uploadedImage.mv(targetPath, (err) => {
            if (err) {
                console.error('文件移动失败:', err);
                return res.status(500).send(err);
            }

            console.log(`图片 '${uniqueFileName}' 已成功存储到: ${targetPath}`);
            // 在这里你可以将图片路径保存到数据库,或者进行其他业务逻辑
            // 例如:保存 `uniqueFileName` 到数据库的 `dish` 记录中

            res.redirect('/success'); // 上传成功后重定向到其他页面
        });

    } catch (error) {
        console.error('处理文件上传时发生错误:', error);
        res.status(500).send('服务器内部错误。');
    }
});

// 示例成功页面路由
router.get('/success', (req, res) => {
    res.send('图片上传成功!');
});

module.exports = router;

关键点:

  • req.files.thumbnail:express-fileupload会将上传的文件信息放在 req.files 对象中,thumbnail 对应前端 input 标签的 name 属性。
  • uploadedImage.mv(targetPath, callback):这是 express-fileupload 提供的核心方法,用于将上传的文件从其临时位置移动到服务器上的指定路径。它是一个异步操作,需要一个回调函数来处理成功或失败。
  • uniqueFileName:为了避免文件名冲突,建议为上传的文件生成一个唯一的名称(例如,结合时间戳和原始文件名)。
  • fs.mkdirSync(uploadDir, { recursive: true }):在尝试保存文件之前,确保目标目录存在。如果不存在,则创建它。

4. 注意事项与最佳实践

  • 文件命名: 务必为上传的文件生成唯一的名称,以防止文件覆盖和安全问题。可以使用 UUID 或时间戳结合原始文件名。
  • 文件类型验证: 除了前端的 accept 属性,后端也应该进行文件类型验证,防止恶意用户上传可执行文件或其他非法文件。可以检查 uploadedImage.mimetype。
  • 文件大小限制: 在 express-fileupload 配置中设置 limits 属性,限制上传文件的大小,防止服务器资源耗尽。
  • 错误处理: 对文件移动操作进行健壮的错误处理,及时向用户反馈问题。
  • 目录权限: 确保服务器上的目标存储目录具有写入权限。
  • 安全性: 不要将用户上传的文件直接暴露在Web服务器的根目录。最好将它们存储在应用程序目录之外,并通过特定的路由进行访问,或者进行CDN分发。
  • 异步操作: 文件上传和移动是异步操作,确保你的代码能够正确处理回调或使用 async/await 结构。

总结

通过上述步骤,你已经学会了如何在Node.js Express应用中实现文件上传功能。核心流程包括:在HTML表单中设置 enctype="multipart/form-data",在后端使用 express-fileupload 中间件解析文件,并通过其 mv() 方法将文件安全地存储到服务器的指定目录。结合适当的文件命名、类型验证和错误处理,可以构建一个稳定可靠的文件上传系统。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

182

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

454

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

407

2026.02.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

AngularJS教程
AngularJS教程

共24课时 | 4.1万人学习

CSS教程
CSS教程

共754课时 | 41.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号