go压缩文件导入及数据库写入

//zip导入
func (c *UserManageController) Import2() {
	if c.Ctx.Request.Method == "POST" {
		c.Import2Save()
	}
	c.setTpl("usermanage/import2.html", "shared/layout_pullbox.html")
	c.LayoutSections = make(map[string]string)
	c.LayoutSections["footerjs"] = "usermanage/import2_footerjs.html"
}
func (c *UserManageController) Unzip(fileName string) ([]string, string, error) {
	var imgGt2m = []string{}
	var excelFileName = ""
	/******/
	zipFile, err := zip.OpenReader(fileName)
	if err != nil {
		utils.LogError(fmt.Sprintln("Openfile Error: ", err))
	}
	defer zipFile.Close()
	//fmt.Println("zipFile :", zipFile)
	//fmt.Println("zipFile.File :", zipFile.File)
	for _, innerFile := range zipFile.File {
		//fmt.Println("innerFile name :", innerFile.Name)
		fmt.Println("innerFile flag :", innerFile.Flags)
		//gbk转码
		html := string(innerFile.Name)
		enc := mahonia.NewDecoder("gbk")
		strName := enc.ConvertString(html)
		fmt.Println("strName:", strName)
		//创建解压文件夹dir
		info := innerFile.FileInfo()
		if info.IsDir() {
			err = os.MkdirAll("static/users/"+strName, os.ModePerm)
			if err != nil {
				utils.LogError(fmt.Sprintln("info.IsDir->Unzip File Error : ", err))
				fmt.Println("Unzip File Error : " + err.Error())
				break
			}
		}
		//解压文件file
		srcFile, err := innerFile.Open()
		fmt.Println("srcFile :", srcFile)
		if err != nil {
			utils.LogError(fmt.Sprintln("innerFile.Open->Unzip File Error : ", err))
			fmt.Println("Unzip File Error : " + err.Error())
		}
		defer srcFile.Close()
		newFile, err := os.Create("static/users/" + strName)
		if err != nil {
			utils.LogError(fmt.Sprintln("os.Create->Unzip File Error : ", err))
			fmt.Println("Unzip File Error : " + err.Error())
		}
		io.Copy(newFile, srcFile)
		defer newFile.Close()
		//获取照片大小,大于2M写入imgGt2m做入库比对
		if path.Ext(strName) != ".xlsx" && path.Ext(strName) != ".txt" {
			filesize := innerFile.FileInfo().Size()
			//fmt.Println("filesize:",filesize)
			if filesize > 2*1024*1024 {
				imgGt2mTemp := strings.Split(strName, "/")[1]
				//imgGt2m = imgGt2mTemp
				imgGt2m = append(imgGt2m, imgGt2mTemp)
				utils.LogError(fmt.Sprintln("imgGt2m : ", imgGt2m))
			}
		}
		if path.Ext(strName) == ".xlsx" {
			excelFileName = "static/users/" + strName
		}
	}
	return imgGt2m, excelFileName, err
}
func (c *UserManageController) ExcelToSql(excelFileName string, imgGt2m []string) (int, int, string, error) {
	var succNum = 0
	var failNum = 0
	var fail = ""
	//判断文件类型 xlsx,写入数据库操作

	/*xlsx处理*/
	xlFile, err := xlsx.OpenFile(excelFileName)
	//defer os.Remove(excelFileName)
	if err != nil {
		fmt.Printf("open failed: %s\n", err)
		utils.LogError(fmt.Sprintln("Openfile Error : ", err))
	}
	qs := orm.NewOrm().QueryTable(models.UserManageTBName())
	i, _ := qs.PrepareInsert()
	defer i.Close();
	os.Remove(excelFileName)
	for _, sheet := range xlFile.Sheets {
		//fmt.Printf("Sheet Name: %s\n", sheet.Name)
		if sheet.Name == "sheet" {
			fmt.Printf("Sheet len: %v\n", len(sheet.Rows)) //len = 1 无数据
			if len(sheet.Rows) <= 1 {
				failNum += 1
				fail += "Excel表行内容为空."
				continue
			}
			for j := 1; j < len(sheet.Rows); j++ { //忽略标题行
				data := models.UserManage{}
				data.Name = fmt.Sprintf("%s", sheet.Rows[j].Cells[0])
				data.Pin = fmt.Sprintf("%s", sheet.Rows[j].Cells[1])
				data.Photo = "/static/users/images/" + fmt.Sprintf("%s", sheet.Rows[j].Cells[2])	//先赋值,以免imgGt2m为空
				var isStop = ""
				for _, val := range imgGt2m {
					if val == fmt.Sprintf("%s", sheet.Rows[j].Cells[2]) {
						failNum += 1
						fail += val + "大于2M."
						isStop = "stop"
					} else {
						data.Photo = "/static/users/images/" + fmt.Sprintf("%s", sheet.Rows[j].Cells[2])
					}
				}
				if isStop == "stop" {
					continue
				}
				data.Cardid = fmt.Sprintf("%s", sheet.Rows[j].Cells[3])
				data.OrgName = fmt.Sprintf("%s", sheet.Rows[j].Cells[4])
				data.Creator = &c.curUser
				//是否存在部门
				org := make([]*models.Organization, 0)
				hasOrg, _ := orm.NewOrm().QueryTable(models.OrganizationTBName()).Filter("name", data.OrgName).All(&org)
				if data.Name == "" || data.Pin == "" {
					failNum += 1
					fail += "姓名、人员编号不能为空."
					continue
				} else if hasOrg == 0 {
					failNum += 1
					fail += "不存在部门:" + data.OrgName + "."
					continue
				} else {
					userData := models.UserManage{Pin: data.Pin}
					hasUser := orm.NewOrm().Read(&userData, "pin")
					if hasUser != nil {
						/******/
						succNum += 1
						//fmt.Println("查询不到")//插入表
						id, _ := i.Insert(&data)
						fmt.Printf("id :%v \n", id)
					} else {
						failNum += 1
						fail += "人员编号:" + data.Pin + "已存在."
						continue
					}
				}
			}
		} else {
			c.jsonResult(enums.JRCodeFailed, "excel工作表须为 'sheet'", 0)
		}
	}
	return succNum, failNum, fail, err
}
func (c *UserManageController) Import2Save() {
	//获取上传url
	str := c.GetString("Url")
	fmt.Println("Url:", str)
	fileName := "static/users/" + str
	if path.Ext(fileName) != ".zip" {
		c.jsonResult(enums.JRCodeFailed, "文件类型错误,请选择 *.zip 文件 !", 0)
	}
	imgGt2m, excelFileName, errUnzip := c.Unzip(fileName)
	if errUnzip != nil {
		c.jsonResult(enums.JRCodeFailed, "解压文件打开失败!", 0)
	}
	succNum, failNum, fail, errExcelToSql := c.ExcelToSql(excelFileName, imgGt2m)
	if errExcelToSql != nil {
		c.jsonResult(enums.JRCodeFailed, "*.xlsx文件打开失败!", 0)
	}
	/******/
	if succNum > 0 && failNum > 0 {
		c.jsonResult(enums.JRCodeSucc, "成功数量: "+strconv.Itoa(succNum)+",失败数量: "+strconv.Itoa(failNum)+";原因: "+fail, 0)
	} else if succNum > 0 && failNum == 0 {
		c.jsonResult(enums.JRCodeSucc, "成功数量: "+strconv.Itoa(succNum), 0)
	} else {
		c.jsonResult(enums.JRCodeFailed, "失败数量: "+strconv.Itoa(failNum)+";原因: "+fail, 0)
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Java的ZipInputStream类来读取zip压缩文件,然后将数据写入数据库。以下是一个简单的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipFileReader { public static void main(String[] args) { String zipFilePath = "path/to/your/zip/file.zip"; String dbUrl = "jdbc:mysql://localhost:3306/mydatabase"; String dbUsername = "your-username"; String dbPassword = "your-password"; try { // 打开数据库连接 Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword); // 创建插入数据的SQL语句 String insertQuery = "INSERT INTO your_table_name (file_name, file_data) VALUES (?, ?)"; // 创建PreparedStatement对象 PreparedStatement pstmt = conn.prepareStatement(insertQuery); // 创建ZipInputStream对象 ZipInputStream zipInput = new ZipInputStream(new FileInputStream(zipFilePath)); // 读取zip文件中的每个条目 ZipEntry entry = zipInput.getNextEntry(); while (entry != null) { // 读取条目的文件名和数据 String fileName = entry.getName(); byte[] fileData = new byte[(int) entry.getSize()]; zipInput.read(fileData); // 设置参数并执行插入语句 pstmt.setString(1, fileName); pstmt.setBytes(2, fileData); pstmt.executeUpdate(); // 关闭当前条目,准备读取下一个条目 zipInput.closeEntry(); entry = zipInput.getNextEntry(); } // 关闭ZipInputStream、PreparedStatement和数据库连接 zipInput.close(); pstmt.close(); conn.close(); System.out.println("数据成功写入数据库!"); } catch (IOException | SQLException e) { e.printStackTrace(); } } } ``` 请将代码中的以下内容替换为您自己的信息: - `zipFilePath`:您的zip文件的路径。 - `dbUrl`:您的数据库URL。 - `dbUsername`:您的数据库用户名。 - `dbPassword`:您的数据库密码。 - `your_table_name`:您要插入数据的表名。 这段代码将逐个读取zip文件中的条目,并将每个条目的文件名和数据插入到数据库中。您需要根据自己的需求修改代码以适应您的数据库结构和数据处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值