新闻中心
使用HTML表单向Node.js应用发送POST请求的文件上传教程

本文旨在解决HTML表单无法正确向Node.js应用发送文件的问题。通过修改前端J*aScript代码,使用Fetch API发送FormData,并调整Node.js后端Multer配置,确保文件能够成功上传到指定目录。本文将详细介绍前端HTML、J*aScript代码的修改,以及后端Node.js代码的配置,并提供完整的代码示例,帮助开发者快速实现文件上传功能。
前端HTML表单的配置
首先,确保HTML表单的enctype属性设置为multipart/form-data,这是文件上传的关键。同时,移除form标签中的action属性,因为我们将使用J*aScript的Fetch API来处理表单提交。
<form method="POST" name="form" class="form vert-align" enctype="multipart/form-data" > <!-- 表单内容 --> </form>
前端J*aScript代码的修改
原始的J*aScript代码尝试通过直接提交表单来上传文件,但这种方式存在一些问题。我们需要修改J*aScript代码,使用Fetch API来异步发送FormData。
以下是修改后的J*aScript代码:
/* regular expression to show thousand separator */
function numberWithDots(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
let myFiles;
let formData = new FormData();
$(document).ready(function () {
$("#cancel").on("click", function () {
location.reload();
});
$("#submit").on("click", function (e) {
e.preventDefault();
fetch("http://localhost:3000/upload", {
method: 'POST',
body: formData
})
.then((res) => console.log(res))
.catch((err) => ("Error occured", err));
});
$("#file").on("change", (event) => {
myFiles = event.target.files;
for (let i = 0; i < myFiles.length; i++) {
let file = myFiles[i];
formData.append("files", file, file.name);
}
/* creates a container for the list that will be created */
$(".container1").html(
"<div class='container2'>" +
"<span class='pop-head'>Uploaded:</span> <ul></ul></div>"
);
$(".first-page").css("margin-top", "10vh");
/* writes the name and size of the files chosen */
for (let i = 0; i < event.target.files.length; i++) {
$("ul").append(
"<li><div class='container4'><span href='" +
event.target.files[i] +
"' download>" +
event.target.files[i].name +
" (" +
numberWithDots(Math.floor(event.target.files[i].size / 1024 + 1)) +
" KB)</span> " +
"<label for='remove" +
i +
"' class='label-style-1 remove' id='lab" +
i +
"'>REMOVE</label>" +
"<input type='button' id='remove" +
i +
"' name='remove" +
i +
"' hidden>" +
"</div></li>"
);
}
/* removes upload file button */
$(".upload-label").remove();
$("#file").remove();
/* shows OK & CANCEL buttons */
$(".submit-label").show();
$(".cancel-label").show();
///* TO IMPLEMENT SERVER SIDE *///
$(".remove").on("click", function () {
let index = $(this).attr("id").replace("lab", "");
let fileToRemove = this.files[index];
let z = [];
for (let i = 0; i < myFiles.length; i++) {
const file = myFiles[i];
if (file.name !== fileToRemove.name) {
z.push(file)
}
}
myFiles = z;
// Esegui l'azione di rimozione del file qui
console.log("File da rimuovere:", fileToRemove);
// Rimuovi l'elemento <li> corrispondente dall'elenco
$(this).closest("li").remove();
});
});
});关键修改:
- 阻止表单的默认提交行为:在#submit的click事件处理函数中,使用e.preventDefault();阻止表单的默认提交行为。
- 使用Fetch API发送FormData:使用fetch函数向Node.js后端发送POST请求,并将formData作为请求体。
后端Node.js代码的配置
在Node.js后端,我们需要使用multer中间件来处理文件上传。确保multer的配置与前端FormData的字段名一致。
ChatCut
AI视频剪辑工具
1086
查看详情
以下是修改后的Node.js代码:
/* modules necessary */
const express = require("express");
const path = require("path");
const multer = require("multer");
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads");
},
filename: (req, file, cb) => {
cb(null, Date.now() + "-" + path.basename(file.originalname));
},
});
const upload = multer({ storage: storage });
/* new instance of express object */
const app = express();
app.use(express.static(path.join(__dirname, "public")));
app.get("/",(req,res)=>{
res.sendFile(__dirname+'/public/assets/index.html')
})
app.post("/upload", upload.array("files"), (req, res) => {
console.log(req);
res.send("Uploaded");
});
/* handles all requests without a corresponding route */
app.use((req, res) => {
res.status(404);
res.send("<h1>Error 404: Resource not found</h1>");
});
/* where the app is hosted */
app.listen(3000);关键修改:
- 修改multer的字段名:将upload.array("file")修改为upload.array("files"),确保与前端FormData的字段名files一致。
目录结构
确保你的目录结构如下:
- app.js
- public/
- index.html
- index-script.js
- style.css
- assets/
- imgs/
- temp-icon.png
- fonts/
- WorkSans.ttf
- uploads/注意事项
- 确保Node.js应用已安装express和multer:npm install express multer
- 前端代码中的fetch请求地址http://localhost:3000/upload需要与你的Node.js应用监听的端口和路由一致。
- uploads文件夹需要存在,并且Node.js应用有写入权限。
- 在实际生产环境中,需要对上传的文件进行安全验证,例如文件类型、大小等。
总结
通过以上修改,你应该能够成功地使用HTML表单向Node.js应用发送POST请求,并上传文件到指定目录。关键在于前端使用Fetch API发送FormData,后端使用Multer中间件处理文件上传,并确保前后端配置的字段名一致。希望本教程能够帮助你解决文件上传问题。
以上就是使用HTML表单向Node.js应用发送POST请求的文件上传教程的详细内容,更多请关注其它相关文章!
# javascript
# css
# 文件上传
# 表单
# ai
# 后端
# 端口
# app
# npm
# node
# node.js
# 前端
# js
# html
# java
# 东莞seo新手入门
# 网络推广网站免费
# 画家广场网站推广怎么做
# 香港网站推广平台哪个好
# 神农架网站优化推广
# 暖玛士营销推广
# 青海外贸网站海外推广
# 合肥seo推广公司费用多少
# 泸州营销推广多少钱
# 网站建设汇编资料
# 这是
# 背景色
# 上传文件
# 复选框
# 如何实现
# 弹出
# 字段名
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*aScript中安全有效地处理localStorage字符串数据
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
顺丰快递查单号物流信息 顺丰快递小程序查询入口
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
零跑汽车11月交付量达70327台 实现连续9个月正增长
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
BetterDiscord插件中安全更新用户简介的实践指南
微信网页版登录教程_微信网页版登录入口在哪
ArrayList与LinkedList核心操作的Big-O复杂度分析
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
解决Bootstrap卡片顶部边距导致背景图下移的问题
uc浏览器网页版入口 uc浏览器网页版最新网址
微信群消息显示延迟如何解决 微信群消息刷新优化方法
J*aScript数据结构转换:将对象数组按类别分组
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
Go Martini框架:动态服务解码后的图片内容
Win11怎么开启高性能模式_Windows 11电源计划优化设置
构建轻量级网站内部消息系统:Formspree 集成指南
ACG动漫视频网入口 ACG动漫*免费正版观看地址
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
外媒分析《GTA6》定价:卖100美元可以但真没必要!
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
微信网页版官方入口教程 微信网页版网页版快速登录步骤
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
Mac怎么查看崩溃日志_Mac控制台错误报告分析
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
必由学官方平台入口 必由学在线课堂登录地址
12306怎么选座位选到安静区_12306选座安静区域选择策略


2025-11-17
浏览次数:次
返回列表
"</div></li>"
);
}
/* removes upload file button */
$(".upload-label").remove();
$("#file").remove();
/* shows OK & CANCEL buttons */
$(".submit-label").show();
$(".cancel-label").show();
///* TO IMPLEMENT SERVER SIDE *///
$(".remove").on("click", function () {
let index = $(this).attr("id").replace("lab", "");
let fileToRemove = this.files[index];
let z = [];
for (let i = 0; i < myFiles.length; i++) {
const file = myFiles[i];
if (file.name !== fileToRemove.name) {
z.push(file)
}
}
myFiles = z;
// Esegui l'azione di rimozione del file qui
console.log("File da rimuovere:", fileToRemove);
// Rimuovi l'elemento <li> corrispondente dall'elenco
$(this).closest("li").remove();
});
});
});