go语言实现文件夹上传前后端代码案例

go语言实现文件夹上传前后端代码案例

前端用于上传的测试界面

  • 如果上传的文件夹有子文件要遍历子文件夹创建出子文件夹再进行拷贝
  • 需要获取文件名和对应的路径,将文件的相对路径和文件对象添加到FormData中
  • 这几行代码很关键
for (let i = 0; i < files.length; i++) {formData.append('model_folder', files[i], files[i].webkitRelativePath);}

前端代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Upload Folder Example</title>
</head>
<body>
<input type="file" id="folderInput" webkitdirectory mozdirectory directory multiple>
<button onclick="uploadFolder()">Upload</button><script>function uploadFolder() {let input = document.getElementById('folderInput');// 确保用户选择了一个文件夹if (!input.files || !input.files.length) {return alert('Please select a folder to upload.');}let files = input.files;let formData = new FormData();// 将文件的相对路径和文件对象添加到FormData中for (let i = 0; i < files.length; i++) {formData.append('model_folder', files[i], files[i].webkitRelativePath);}// 创建一个 XMLHttpRequest 对象进行异步请求let request = new XMLHttpRequest();request.open('POST', 'http://localhost:8089/digitalPerson/modeFile', true);request.onload = function() {if (request.status === 200) {// 文件上传成功的处理console.log(request.responseText);} else {// 文件上传失败的处理console.error(request.responseText);}};// 发送FormData对象到服务器request.send(formData);}
</script>
</body>
</html>

后端使用gin实现文件夹的上传和保存到对应的路径

package controllersimport ("PsycheEpic/src/utils""errors""fmt""github.com/gin-gonic/gin""net/http""os""path/filepath""strings"
)// 处理文件夹上传
func UploadFolderHandler(c *gin.Context, digitalId int64) error {err := c.Request.ParseMultipartForm(0) // 不限制上传文件大小if err != nil {c.JSON(http.StatusOK, gin.H{"code":    0,"message": err.Error(),})return errors.New("获取上传的文件失败")}//digitalId := 3// 数字人ID转换为字符串digital_Id := utils.Strval(digitalId)modePath := filepath.Join("./static/HuaSoul/asset/", digital_Id)fmt.Println("digitalId: ", digitalId)// 检查上传的文件是否存在form, err := c.MultipartForm()files := form.File["model_folder"] // 'files' 是前端 JavaScript 中指定的字段名if err != nil {c.JSON(http.StatusOK, gin.H{"code":    0,"message": "missing uploaded file"})return errors.New("丢失上传的文件")}// 创建模型文件夹if err := os.MkdirAll(modePath, 0755); err != nil {c.JSON(http.StatusOK, gin.H{"code":    0,"message": "failed to create model folder",})return errors.New("failed to create model folder")}// 遍历上传的文件for _, file := range files {fileName := file.Header["Content-Disposition"]path, _ := GetFileName(fileName)fmt.Println("path: ", path)savePath := filepath.Join(modePath, path) // 保存文件的路径,确保'uploads'文件夹已存在或自动创建if err := c.SaveUploadedFile(file, savePath); err != nil {c.String(http.StatusOK, fmt.Sprintf("'%s' could not be saved: %v", file.Filename, err))return err}}// 上传成功后返回响应//c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))return nil
}//fileName [form-data; name="model_folder"; filename="test/头像.jpg"] ;取出文件名
func GetFileName(fileName []string) (string, error) {for _, f := range fileName {// 判断字符串是否包含了需要查找的文件名关键字if strings.Contains(f, `filename=`) {// 按照 filename=" 分割parts := strings.Split(f, `filename="`)if len(parts) < 2 {// 没有找到分隔符,跳到下一个元素continue}// 按照 " 分割以获取实际的文件路径filePathParts := strings.SplitN(parts[1], `"`, 2)// 如果成功找到路径就返回if len(filePathParts) >= 2 {return filePathParts[0], nil // 返回找到的路径}}}// 如果没有找到,返回错误return "", fmt.Errorf("no path found")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF控件Spire.PDF for .NET【转换】演示:将多个图像转换为单个 PDF

如果您想要将多个图像合并为一个文件以便于分发或存储&#xff0c;将它们转换为单个 PDF 文档是一个很好的解决方案。这一过程不仅节省空间&#xff0c;还确保所有图像都保存在一个文件中&#xff0c;方便共享或传输。在本文中&#xff0c;您将学习如何使用Spire.PDF for .NET …

为什么选择计算机?

还记得当初自己为什么选择计算机&#xff1f; 当然记得。高一下学期(2017年)听数学老师说着大数据&#xff0c;听着是那么牛&#xff0c;那么神奇&#xff0c;还说着目前社会上也缺少这样的人&#xff0c;然后那时候就有个这样的梦&#xff0c;想去学&#xff0c;想去当那少数…

36 动态规划之编辑距离

问题描述&#xff1a;给你两个单词word1和word2&#xff0c;请你计算出将word1转换为word2所需要的最少操作数。插入一个字符删除一个字符替换一个字符&#xff1b; 暴力穷举法&#xff1a;将短的那一个串作为子串(长度s)&#xff0c;寻找在母串(长串长度p)共同字符最多的情况…

Electron V28主进程与渲染进程互相通信总结

本文示例采用ElectronVue3TS编写&#xff0c;请读者理顺思路&#xff0c;自行带入自己的项目。 注&#xff1a; 读本文前请先搞懂什么是主进程&#xff0c;什么是渲染进程。 在Electron中有着ipcMain和ipcRenderer、contextBridge模块&#xff0c;以及创建窗口对象上的webCont…

-bash: docker-compose: 未找到命令

-bash: docker-compose: 未找到命令 我在使用Docker搭建Nacos容器时遇到了这个问题&#xff1a;是没有安装 docker-compose工具 。 docker-compose的用处主要体现在以下几个方面&#xff1a; 快速搭建开发环境&#xff1a;使用docker-compose可以快速搭建起开发环境&#xff0…

一分钟轻松制作AI数字人播报视频

随着人工智能的快速发展&#xff0c;AI数字人播报成为了媒体和信息传播领域的一项创新技术。AI数字人播报是利用人工智能技术创建的一系列短视频&#xff0c;以新闻主播为中心&#xff0c;展示各种场景和情境能够以短视频的形式进行新闻的报道。这种创新的内容形式在社交媒体和…

Java刷题篇——单链表练习题上

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例2 输入&#xff1a;head [1,2] 输出&…

<软考高项备考>《论文专题 - 14 绩效域(四)》

8 交付绩效域 交付绩效域涉及与交付项目相关的活动和职能。在项目整个生命周期过程中&#xff0c; 有效执行本绩效域可以实现预期目标&#xff0c;主要包含&#xff1a; ①项目有助于实现业务目标和战略&#xff1b; ②项目实现了预期成果&#xff1b; ③在预定时间内实现了项…

Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

PostgreSQL基础

一、数据库操作命令 创建数据库 CREATE DATABASE xxxxxxx; 删除数据库 drop databse xxxxx; 查看所有数据库 \l 切换数据库 \c xxx 二、模式的更改 a)重命名&#xff1a;alter schema 旧名字 to 新名字; b)修改模式的归属用户&#xff1a;alter schema 模式名 to 新用户; 模式…

CDH安装出现Cannot open channel to X at election address Connection refused

CDH安装出现Cannot open channel to X at election address Connection refused 在刚刚启动cdh的时候要是出现以上的问题或者 org.apache.zookeeper.server.quorum.QuorumCnxManager: Cannot open channel to 3 at election address srv252/10.1.50.252:4181 java.net.Connec…

06组团队项目-Beta冲刺-2/3

github仓库&#xff1a;https://github.com/orgs/oucdehaze/repositories 冲刺概况汇报 前端 上周冲刺中完成的任务及遇到的问题 这一周我们小组中负责前端部分的同学继续完善了web网页的界面。在上一周的基础上对字体颜色和字体内容进行了修改&#xff0c;使得网站的专业性…

高可用接入层技术演化及集群概述

集群概述 集群的介绍及优势 集群&#xff1a;将多台服务器通过硬件或软件的方式组合起来&#xff0c;完成特定的任务&#xff0c;而这些服务器对外表现为一个整体。集群的优势 高可靠性&#xff1a;利用集群管理软件&#xff0c;当主服务器故障时&#xff0c;备份服务器能够自…

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所…

【SpringBoot实战】实现用户名密码登录

【SpringBoot实战】实现用户名密码登录 在Java项目中&#xff0c;实现用户名密码登录是最基本的功能。尽管实现起来不难&#xff0c;但也有些细节问题&#xff0c;故写下此篇博客作为记录。 1.创建用户表 CREATE TABLE ad_user (id int unsigned NOT NULL COMMENT 主键,name…

代码随想录算法训练营第五十五天 _ 动态规划_392. 判断子序列、115.不同的子序列。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 392. 判断子序列 这个题目就是 …

消息队列kafka详解:Kafka原理分析总结

一、概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统&#xff0c;后成为Apache的一部分&#xff0c;它使用Scala编写&#xff0c;以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark等都支持与Kafka集成。 Kaf…

EasyMock介绍及安装方法(亲测可用)

1. EasyMock介绍 Easy Mock是一个可视化&#xff0c;并且能快速生成模拟数据的服务。以项目管理的方式组织Mock List&#xff0c;能帮助我们更好的管理Mock数据&#xff0c;不怕丢失。 2. EasyMock魅力 前后端分离&#xff1a;让前端工程师独立于后端进行开发 增加单元测试…

SGPIO介紹

什么是SGPIO&#xff1f; Serial General Purpose Input Output (SGPIO) is a method to serialize general purpose IO signals. SGPIO defines the communication between an initiator (e.g. a host bus adapter) and a target (e.g. a backplaneholding disk drives). The …

美易官方:投行把脉明年油市,花旗悲观、高盛最看涨

投行把脉明年油市&#xff0c;花旗悲观、高盛最看涨 随着全球经济的逐步复苏&#xff0c;石油市场的走势备受关注。各大投行对明年油市的预测也各不相同&#xff0c;其中花旗集团较为悲观&#xff0c;而高盛集团则最为看涨。 华尔街的预测师们认为明年原油价格有一定的恢复空间…