新闻中心

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

2025-11-17
浏览次数:
返回列表

使用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();
    });
  });
});

关键修改:

  1. 阻止表单的默认提交行为:在#submit的click事件处理函数中,使用e.preventDefault();阻止表单的默认提交行为。
  2. 使用Fetch API发送FormData:使用fetch函数向Node.js后端发送POST请求,并将formData作为请求体。

后端Node.js代码的配置

在Node.js后端,我们需要使用multer中间件来处理文件上传。确保multer的配置与前端FormData的字段名一致。

ChatCut ChatCut

AI视频剪辑工具

ChatCut 1086 查看详情 ChatCut

以下是修改后的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);

关键修改:

  1. 修改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选座安静区域选择策略 

搜索