前端读取文件夹并通过 SSH 上传:完整实现方案 ✅

作者:excel日期:2025/10/6

在 Web 应用中,除了单文件上传,很多时候我们还需要用户直接选择整个文件夹,并批量上传到远程服务器。典型场景包括:静态资源部署、文档归档、远程备份等。本文整合了 前端文件夹选择方案(webkitdirectory + File System Access API)Node.js + node-ssh 后端上传,实现端到端的完整流程。


前端部分:选择文件夹并上传

前端的目标是让用户选择目录,遍历其中所有文件,并逐一上传到后端。

方案一:webkitdirectory

这是目前兼容度最好的方式,Chrome、Edge、Safari 均支持。

1<input type="file" id="folder" webkitdirectory multiple>
2<script>
3  document.getElementById('folder').addEventListener('change', async (event) => {
4    const files = event.target.files;
5
6    for (const file of files) {
7      console.log(file.webkitRelativePath, file.name);
8
9      const formData = new FormData();
10      formData.append("file", file, file.webkitRelativePath);
11
12      await fetch("http://localhost:3000/upload", {
13        method: "POST",
14        body: formData
15      });
16    }
17  });
18</script>
19

优点

  • ✅ 兼容度较好,支持主流浏览器。
  • ✅ 能保留相对路径,方便后端还原目录结构。

缺点

  • ❌ Firefox 支持度差。
  • ❌ 必须通过 <input> 触发,不够灵活。

方案二:File System Access API

这是现代浏览器支持的新特性,可以通过 JS 调用目录选择器。

1<script>
2async function readDir() {
3  const dirHandle = await window.showDirectoryPicker();
4
5  for await (const entry of dirHandle.values()) {
6    if (entry.kind === "file") {
7      const file = await entry.getFile();
8      console.log(entry.name);
9
10      const formData = new FormData();
11      formData.append("file", file, entry.name);
12
13      await fetch("http://localhost:3000/upload", {
14        method: "POST",
15        body: formData
16      });
17    }
18  }
19}
20</script>
21
22<button onclick="readDir()">选择文件夹并上传</button>
23

优点

  • ✅ 灵活,可结合按钮、拖拽交互。
  • ✅ 支持读写权限,可操作文件。

缺点

  • ❌ 兼容性差,仅 Chromium 内核浏览器支持(Chrome、Edge)。
  • ❌ 需要用户手动授权目录访问。

Node.js 后端:接收并通过 SSH 上传

后端主要任务:接收前端传输的文件 → 缓存到本地 → 通过 SSH 上传到远程服务器 → 删除缓存。

安装依赖

npm install express multer node-ssh

完整后端代码

1const express = require('express');
2const multer = require('multer');
3const { NodeSSH } = require('node-ssh');
4const path = require('path');
5const fs = require('fs');
6
7const app = express();
8const upload = multer({ dest: 'uploads/' });
9const ssh = new NodeSSH();
10
11// SSH 配置
12const sshConfig = {
13  host: 'your-server-ip',
14  username: 'your-username',
15  privateKey: '/path/to/private/key' // 或 password
16};
17
18// 接收文件上传
19app.post('/upload', upload.single('file'), async (req, res) => {
20  try {
21    const localPath = req.file.path;
22    const remotePath = path.join('/remote/dir', req.file.originalname);
23
24    await ssh.connect(sshConfig);
25    await ssh.putFile(localPath, remotePath);
26
27    fs.unlinkSync(localPath); // 删除本地缓存文件
28
29    res.send('上传成功');
30  } catch (err) {
31    console.error(err);
32    res.status(500).send('上传失败');
33  }
34});
35
36app.listen(3000, () => {
37  console.log('服务已启动: http://localhost:3000');
38});
39

工作流程

  1. 前端选择目录,逐个文件打包成 FormData
  2. 文件 POST 到后端 /upload
  3. 后端存储临时文件,再通过 node-ssh 传输到远程服务器。
  4. 删除临时文件,完成上传。

优缺点对比

前端

  • webkitdirectory:兼容更好,但交互有限。
  • File System Access API:交互灵活,但兼容性差。

后端

  • 采用 express + multer,简单易用。
  • 借助 node-ssh,实现自动化远程部署。

总结

  • 如果项目需要支持更多浏览器,推荐 webkitdirectory
  • 如果项目环境可控,推荐 File System Access API,更灵活。
  • 后端使用 Node.js + node-ssh,能快速实现从前端到服务器的自动化传输。

该方案特别适合 批量文件上传、静态资源部署、远程备份 等场景。


前端读取文件夹并通过 SSH 上传:完整实现方案 ✅》 是转载文章,点击查看原文


相关推荐


岚图汽车 x Apache Doris : 海量车联网数据实时分析实践
SelectDB技术团队2025/10/5

岚图汽车作为东风汽车集团旗下高端智慧新能源品牌,自 2019 年创立以来,以用户型科技企业为定位,构建了覆盖 SUV、MPV、轿车三大品类的产品矩阵。依托国务院国资委管理,世界 500 强东风集团五十多年的造车积淀与全产业链资源,岚图汽车坚持自研,打造了 ESSA 原生智能电动架构、中央集中式 SOA 电子电气架构等核心技术,旗下岚图 FREE+、梦想家、追光等车型凭借高品质与技术创新,成为最快实现累计产量突破 20 万辆的央国企新能源高端品牌。2025 年连续月销量破万,产品出口覆盖超 40


Linux--权限
L-n72025/10/4

文章目录 Linux权限的概念Linux权限管理文件访问权限的设置file 指令目录的权限总结 Linux权限的概念 Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户:的命令提示符是“#”,普通用户的命令提示符是“$” 命令:su [用户名] 功能:切换用户。 要从root用户切换到普通用户user,则使用suuser。 要从普通用户user切换到root用户则使用su


PostgreSQL LIMIT 语句详解
lly2024062025/10/2

PostgreSQL LIMIT 语句详解 在数据库操作中,LIMIT 语句是一个非常实用的功能,它允许我们限制查询结果的数量。在 PostgreSQL 中,LIMIT 语句同样发挥着至关重要的作用。本文将详细介绍 PostgreSQL 的 LIMIT 语句,包括其用法、语法以及在实际应用中的注意事项。 1. LIMIT 语句的基本用法 LIMIT 语句通常用于限制查询结果的返回行数。其基本语法如下: SELECT column1, column2, ... FROM table_name WH


【1 月最新】前端 100 问:能搞懂 80% 的请把简历给我
程序员依扬2025/10/2

引言 再更新:上微信搜「高级前端面试」小程序,上下班路上刷题,半年突击进大厂! 更新:目前已达到『23K』Star了,谢谢大家的支持,最近折腾了一个博客网站出来,方便大家阅读,后续会有更多内容和更多优化,猛戳这里查看 ------ 以下是正文 ------ 半年时间,几千人参与,精选大厂前端面试高频 100 题,这就是「壹题」。 在 2019 年 1 月 21 日这天,「壹题」项目正式开始,在这之后每个工作日都会出一道高频面试题,主要涵盖阿里、腾讯、头条、百度、网易等大公司和常见题型。得益于大家


AR眼镜在安防领域人脸识别技术方案|阿法龙XR云平台
北京阿法龙科技有限公司2025/10/2

方案基于AR眼镜构建移动安防人脸识别系统,通过端 - 边 - 云协同架构实现实时身份核验,核心内容如下: 数据采集层 采用AR眼镜内置千万像素红外摄像头,支持 1080P@30fps 实时采集,通过畸变校正算法优化鱼眼效应,获取高质量人脸原始数据。 人脸提取层 在 AR 眼镜端部署轻量级人脸检测模型(如 MobileNet-SSD),通过前端人脸抠像技术实现: 基于 MTCNN 算法进行人脸区域快速定位采用自适应阈值分割去除背景干扰通过仿射变换实现人脸姿态归一化(±30° 姿态矫正)输


鸿蒙与iOS跨平台开发方案全解析
i建模10/1/2025

本文深度解析鸿蒙与iOS跨平台开发的六大主流方案,从技术特性到实战策略全面对比。重点介绍了华为官方ArkUI-X(支持三端编译、原生集成分布式能力)和腾讯开源Kuikly(基于Kotlin跨平台、优化GC性能)两大方案,并对比了Flutter和React Native等跨端框架的适配成本。文章详细探讨了平台差异适配策略,包括导航交互、推送服务和UI一致性的实现方法,并给出性能优化实践。最后根据场景需求给出选型建议:新项目推荐ArkUI-X,高性能应用选择Kuikly,现有Flutter项目可扩展插件方案。未


Java HTTP协议(二)--- HTTPS,Tomcat
英雄不问出处~9/30/2025

面试中经典的面试题https加密:(1) 对称加密,加密业务数据(2) 非对称加密,加密对称密钥(3) 中间人攻击(4) 使用证书,来验证服务器的公钥这些相结合,就保证了https的安全性了。


基于数据挖掘的在线游戏行为分析预测系统
Python极客之家2025/10/8

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :)  1. 项目简介         随着在线游戏市场的快速增长,了解玩家行为对于提高用户留存率、优化游戏设计和提升用户体验变得至关重要。本项目旨在开发一个基于数据挖掘的在线游戏行为分析预测系统,利用先进的算法对玩家的行为数据进行分析,预测玩家的行为模式,并提供相应的优化建议。         该系统将涵盖数据收集、预处理、特征工程、模型训练、预测和结果展示等多个环节,旨在为游戏开发者和运营团队提供一个全面的玩家行为分析平台


一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
追逐时光者2025/10/9

前言 在多设备协同日益普及的今天,高效、流畅的远程控制已成为工作与生活的刚需。网易出品的这款免费远程控制软件,凭借低延迟、高画质与跨平台兼容性,轻松实现手机、平板、Mac、PC、TV 乃至掌机对电脑的远程操控,让自由办公与畅快娱乐触手可及。 工具介绍 网易UU远程是一款由网易出品的专业远程控制软件。支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑,满足远程游戏、办公和协助需求。凭借高速直连和超低延迟,提供流畅的本地操控体验,支持真彩、 HDR 、4K、144 帧画面显示,支持远程开


Go语言实战案例——进阶与部署篇:使用Docker部署Go服务
程序员爱钓鱼2025/10/11

在现代软件开发中,应用的可移植性和环境一致性至关重要。无论是在开发环境、测试环境还是生产环境,我们都希望 Go 项目能够快速部署、稳定运行。而 Docker 正是实现这一目标的关键工具。 本文将带你从零开始,实战演示如何使用 Docker 构建并部署一个 Go Web 服务。通过这个案例,你将学会将 Go 应用打包成轻量级容器镜像,并在任何地方一键运行。 一 为什么使用 Docker 部署 Go 服务 在未使用 Docker 之前,部署 Go 项目通常需要以下步骤: 1 安装 Go 环境 2

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0