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

2023-12-18

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 controllers

import (
	"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")
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • sqlserver-事物日志

    前言 每个 SQL Server 数据库都有事务日志 用于记录所有事务以及每个事务所做的数据库修改 事务日志是数据库的一个关键组件 如果系统出现故障 你将需要依靠该日志将数据库恢复到一致的状态 有关事务日志体系结构和内部组件的详细信息 请参
  • Navicat关闭自动检查更新版本教程

    Navicat关闭自动检查更新版本教程 首先 点击菜单中的工具菜单 弹出了下拉菜单选中为选项 点击选项 首先 点击菜单中的工具菜单 弹出了下拉菜单选中为选项 点击选项 去掉勾选上在启动时自动检查更新选项
  • android无线调试连接

    开发时 遇到一些设备无法通过USB线连接adb时 可以尝试使用wifi无线调试 首先 要确保手机和电脑在同一个局域网内 再到开发者选项中打开无线调试 并进入子页面 如下 图一 无线调试设置界面 点击使用配对码配对设备 会弹出如下对话框 图二
  • ubantu22版本配置静态IP地址

    文章目录 编辑网络配置文件 应用网络配置 查看网络配置结果 编辑网络配置文件 在Ubuntu中配置静态IP地址可以通过以下步骤实现 打开终端 使用以下命令编辑网络配置文件 etc netplan 00 installer config ya
  • 【web网页制作】html+css网页制作游戏主题-王者荣耀(5页面)【附源码下载】

    涉及知识 游戏主题网页制作 王者荣耀网页制作成品 游戏网页制作成品 游戏主题web开发 期末网页大作业 网页作业成品 web前端源码实例 如何制作网页 网页设计思路 如何从零开始制作web页面 专栏 web前端大作业网页制作 关于我 一个持
  • Android NDK开发详解Wear之处理 Wear 上的数据层事件

    Android NDK开发详解Wear之处理 Wear 上的数据层事件 等待数据层调用的状态 异步调用 同步调用 监听数据层事件 使用 WearableListenerService
  • 题解 | #浙江大学用户题目回答情况#

    快手测开二面面经 国企面经 多家 得物 测开 一面 中国联通陕西省分公司薪资待遇 京东健康前端实习一面凉经 求java推荐项目 面经回馈 秋招及实习历程中笔经 面经 时间梳理 国企银行 秒杀项目常见问题 终焉篇 双非本产品经理35w 终于来
  • Redis 底层数据结构

    在 Redis数据结构和对象机制 中提到的图中 我们知道 可以通过 redisObject 对象的 type 和 encoding 属性 可以决定Redis 主要的底层数据结构 SDS QuickList ZipList HashTable
  • EMC RI/CI测试方案助您对抗电磁设备干扰!

    方案背景 电磁或射频干扰的敏感性 会给工程师带来重大的风险和安全隐患 尤其是在工业 船用和医疗设备环境 这些环境系统中的控制 导航 监控 通信和警报等关键零部件必须具备电磁抗扰水平 以确保系统始终正常运行 抗扰系统测试方案一般分为传导抗扰与
  • 大语言模型加速信创软件 IDE 技术革新

    QCon 全球软件开发大会 上海站 将于 12 月 28 29 日举办 会议特别策划 智能化信创软件 IDE 专题 邀请到 华为云开发工具和效率领域首席专家 华为软件开发生产线 CodeArts 首席技术总监王亚伟担任专题出品人 为专题质量
  • System.Text.Json.JsonSerializer 自定义实现序列化 DataSet、DataTable

    System Text Json 从 NET Core 3 1 开始 为了能够序列化这些类型 您需要为JsonConverter
  • sqlserver dba日常操作

    查询慢sql的方法 1 whoisactive 安装方法 http whoisactive com downloads 下载地址 将下载好的zip包放到sqlserver服务器中 文件 打开 文件 下载好的zip包 在查询窗口点击执行 新建
  • 20231218_105720 java 编码与解码

    普通编码 编的码就是编辑器的配置编码 默认是utf 8 byte bytes 中国武汉 getBytes 普通解码 解的码默认按编辑器的配置编码进行解析 默认是utf8 String s new String bytes 将字符串编码为GB
  • 【数学证明 笔记01】证明常见的逻辑方法有哪些?

    文章目录 一 声明 二 直接证明 三 反证法 四 数学归纳法 五 对证法 六 构造法 七 分情况讨论 一 声明 本帖持续更新中 如有纰漏 望指正 二 直接证明 原理 通过一系列逻辑推理和推断来证明目标命
  • 短剧开始“海外开花”

    前不久 一款名为ReelShort的短剧App在国外大杀四方 上了不少新闻不说 甚至还在一夜之间登顶了美国的App下载排行榜 而这一切都得益于国产短剧在海外市场的野蛮生长 谁能想到 曾经风靡国内的霸道甜宠 豪门恩怨 重生复仇 先婚后爱 这些
  • 眼神矫正AI一键修改你的眼睛眼球,直视相机!

    1 系统要求 软件运行支持32位 64位window 10 11系统 硬性要求 英伟达 RTX20系列或者更高级别 其他要求无 2 下载安装 链接 百度网盘 请输入提取码 提取码 1234 复制这段内容后打开百度网盘手机App 操作更方便哦
  • 基于springboot的古城民宿管理系统【论文、源码、开题报告】

    博主介绍 全网个人号和企业号 粉丝40W 每年辅导几千名大学生较好的完成毕业设计 专注计算机软件领域的项目研发 不断的进行新技术的项目实战 热门专栏 推荐订阅 订阅收藏起来 防止下次找不到 千套JAVA实战项目持续更新中 上百套小程序实战项
  • 解决:soundfile打开opus文件出错: File contains data in an unimplemented format.

    Python的soundfile库依赖于libsndfile库 需要安装最新版本 sudo apt get update sudo apt get install libsndfile1 如果之前已经安装soundfile 则可能采用了旧版
  • IdentityServer如何生成mysql ef core连接源码和迁移Migration

    https gitee com heminzhang identity server mysql migrations JohnHe404 IdentityServerMysqlMigrations GitHub 复制最新的Identity
  • go语言实现文件夹上传前后端代码案例

    go语言实现文件夹上传前后端代码案例 前端用于上传的测试界面 如果上传的文件夹有子文件要遍历子文件夹创建出子文件夹再进行拷贝 需要获取文件名和对应的路径 将文件的相对路径和文件对象添加到FormData中 这几行代码很关键 for let