project.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. package admin
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "io"
  9. "net/http"
  10. "os"
  11. "path/filepath"
  12. "server/dao"
  13. "server/global"
  14. "server/model/common/request"
  15. "server/model/common/response"
  16. "strconv"
  17. )
  18. type ProjectApi struct{}
  19. func (pa *ProjectApi) QueryProjectList(c *gin.Context) {
  20. var search request.SearchProject
  21. err := c.ShouldBindJSON(&search)
  22. if err != nil {
  23. response.FailWithMessage("失败", c)
  24. global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
  25. return
  26. }
  27. list, total, err := projectService.QueryProjectList(search)
  28. if err != nil {
  29. response.FailWithMessage("失败", c)
  30. global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
  31. return
  32. }
  33. response.OkWithDetailed(response.PageResult{
  34. List: list,
  35. Total: total,
  36. Page: search.PageInfo.Page,
  37. PageSize: search.PageInfo.PageSize,
  38. }, "获取成功", c)
  39. }
  40. func (pa *ProjectApi) QueryProjectByCode(c *gin.Context) {
  41. code := c.Query("code")
  42. if code == "" {
  43. response.FailWithMessage("编号不能为空", c)
  44. return
  45. }
  46. project, err := projectService.QueryProjectByCode(code)
  47. if err != nil {
  48. response.FailWithMessage("失败", c)
  49. global.GVA_LOG.Error("QueryProjectByCode ====== " + err.Error())
  50. return
  51. }
  52. response.OkWithData(project, c)
  53. }
  54. func (pa *ProjectApi) QueryFileList(c *gin.Context) {
  55. var info request.SearchProjectFileList
  56. err := c.ShouldBindJSON(&info)
  57. if err != nil {
  58. response.FailWithMessage("错误", c)
  59. global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
  60. return
  61. }
  62. list, total, err := projectService.QueryFileList(info)
  63. if err != nil {
  64. response.FailWithMessage("失败", c)
  65. global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
  66. return
  67. }
  68. response.OkWithDetailed(response.PageResult{
  69. List: list,
  70. Total: total,
  71. Page: info.PageInfo.Page,
  72. PageSize: info.PageInfo.PageSize,
  73. }, "获取成功", c)
  74. }
  75. func (pa *ProjectApi) QueryAllProject(c *gin.Context) {
  76. projects, err := projectService.QueryAllProject()
  77. if err != nil {
  78. response.FailWithMessage(err.Error(), c)
  79. return
  80. }
  81. response.OkWithData(projects, c)
  82. }
  83. func (pa *ProjectApi) QueryProjectsInfo(c *gin.Context) {
  84. sum, totalProject, completeProject, unCompleteProject, err := projectService.QueryProjectsInfo()
  85. if err != nil {
  86. response.FailWithMessage(err.Error(), c)
  87. return
  88. }
  89. response.OkWithData(gin.H{
  90. "sum": sum,
  91. "totalProject": totalProject,
  92. "completeProject": completeProject,
  93. "unCompleteProject": unCompleteProject,
  94. }, c)
  95. }
  96. func (pa *ProjectApi) QueryProjectState(c *gin.Context) {
  97. states, err := projectService.QueryProjectState()
  98. if err != nil {
  99. response.FailWithMessage("失败", c)
  100. global.GVA_LOG.Error("QueryProjectState ====== " + err.Error())
  101. return
  102. }
  103. response.OkWithData(states, c)
  104. }
  105. func (pa *ProjectApi) QueryWorkingHours(c *gin.Context) {
  106. code := c.Query("code")
  107. hours, err := projectService.QueryWorkingHours(code)
  108. if err != nil {
  109. response.FailWithMessage(err.Error(), c)
  110. return
  111. }
  112. response.OkWithData(hours, c)
  113. }
  114. func (pa *ProjectApi) QueryWorkingHoursList(c *gin.Context) {
  115. var info request.SearchWorkingHours
  116. err := c.ShouldBindJSON(&info)
  117. if err != nil {
  118. response.FailWithMessage("失败", c)
  119. global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
  120. return
  121. }
  122. list, total, err := projectService.QueryWorkingHoursList(info)
  123. if err != nil {
  124. response.FailWithMessage("失败", c)
  125. global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
  126. return
  127. }
  128. response.OkWithDetailed(response.PageResult{
  129. List: list,
  130. Total: total,
  131. Page: info.PageInfo.Page,
  132. PageSize: info.PageInfo.PageSize,
  133. }, "获取成功", c)
  134. }
  135. func (pa *ProjectApi) QueryWorkingHoursSum(c *gin.Context) {
  136. var info request.SearchWorkingHours
  137. err := c.ShouldBindJSON(&info)
  138. if err != nil {
  139. response.FailWithMessage("失败", c)
  140. global.GVA_LOG.Error("QueryWorkingHoursSum ====== " + err.Error())
  141. return
  142. }
  143. list, total, err := projectService.QueryWorkingHoursSum(info)
  144. if err != nil {
  145. response.FailWithMessage("失败", c)
  146. global.GVA_LOG.Error("QueryWorkingHoursSum ====== " + err.Error())
  147. return
  148. }
  149. response.OkWithDetailed(response.PageResult{
  150. List: list,
  151. Total: total,
  152. Page: info.PageInfo.Page,
  153. PageSize: info.PageInfo.PageSize,
  154. }, "获取成功", c)
  155. }
  156. func (pa *ProjectApi) QueryCollections(c *gin.Context) {
  157. code := c.Query("code")
  158. collections, err := projectService.QueryCollections(code)
  159. if err != nil {
  160. response.FailWithMessage("失败", c)
  161. global.GVA_LOG.Error("QueryCollections ====== " + err.Error())
  162. return
  163. }
  164. response.OkWithData(collections, c)
  165. }
  166. func (pa *ProjectApi) QueryCollectionList(c *gin.Context) {
  167. var info request.SearchProjectList
  168. err := c.ShouldBindJSON(&info)
  169. if err != nil {
  170. response.FailWithMessage("失败", c)
  171. global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
  172. return
  173. }
  174. list, total, err := projectService.QueryCollectionList(info)
  175. if err != nil {
  176. response.FailWithMessage("失败", c)
  177. global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
  178. return
  179. }
  180. response.OkWithDetailed(response.PageResult{
  181. List: list,
  182. Total: total,
  183. Page: info.PageInfo.Page,
  184. PageSize: info.PageInfo.PageSize,
  185. }, "获取成功", c)
  186. }
  187. func (pa *ProjectApi) QueryReimbursementList(c *gin.Context) {
  188. var info request.SearchProjectList
  189. err := c.ShouldBindJSON(&info)
  190. if err != nil {
  191. response.FailWithMessage("失败", c)
  192. global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
  193. return
  194. }
  195. list, total, err := projectService.QueryReimbursementList(info)
  196. if err != nil {
  197. response.FailWithMessage("失败", c)
  198. global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
  199. return
  200. }
  201. response.OkWithDetailed(response.PageResult{
  202. List: list,
  203. Total: total,
  204. Page: info.PageInfo.Page,
  205. PageSize: info.PageInfo.PageSize,
  206. }, "获取成功", c)
  207. }
  208. func (pa *ProjectApi) QueryReimbursement(c *gin.Context) {
  209. code := c.Query("code")
  210. reimbursement, err := projectService.QueryReimbursement(code)
  211. if err != nil {
  212. response.FailWithMessage("失败", c)
  213. global.GVA_LOG.Error("QueryReimbursement ====== " + err.Error())
  214. return
  215. }
  216. response.OkWithData(reimbursement, c)
  217. }
  218. func (pa *ProjectApi) CreateProject(c *gin.Context) {
  219. form, err := c.MultipartForm()
  220. files := form.File["file"]
  221. if err != nil {
  222. response.FailWithMessage("失败", c)
  223. return
  224. }
  225. projectJson := c.PostForm("project")
  226. var project dao.Project
  227. err = json.Unmarshal([]byte(projectJson), &project)
  228. if err != nil {
  229. response.FailWithMessage("JSON失败", c)
  230. return
  231. }
  232. for _, file := range files {
  233. dst := file.Filename
  234. var path = "./uploads/file/" + project.Code + "/立项" + "/" + dst
  235. projectFile := dao.ProjectFile{
  236. ProjectCode: project.Code,
  237. Name: dst,
  238. Path: path,
  239. Genre: 1,
  240. }
  241. project.Files = append(project.Files, projectFile)
  242. // gin 简单做了封装,拷贝了文件流
  243. if err := c.SaveUploadedFile(file, path); err != nil {
  244. response.FailWithMessage("上传失败", c)
  245. return
  246. }
  247. }
  248. err = projectService.CreateProject(project)
  249. if err != nil {
  250. response.FailWithMessage(err.Error(), c)
  251. return
  252. }
  253. response.OkWithMessage("创建成功", c)
  254. }
  255. func (pa *ProjectApi) CreateProjectFile(c *gin.Context) {
  256. form, err := c.MultipartForm()
  257. if err != nil {
  258. response.FailWithMessage("失败", c)
  259. return
  260. }
  261. files := form.File["file"]
  262. genre := c.PostForm("genre")
  263. if len(genre) <= 0 {
  264. response.FailWithMessage("类型为空", c)
  265. return
  266. }
  267. code := c.PostForm("code")
  268. genreId, err := strconv.Atoi(genre)
  269. if err != nil {
  270. response.FailWithMessage("错误", c)
  271. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  272. return
  273. }
  274. fileGenre, err := fileService.QueryFileGenreById(genreId)
  275. if err != nil {
  276. response.FailWithMessage("错误", c)
  277. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  278. return
  279. }
  280. for _, file := range files {
  281. dst := file.Filename
  282. var path = "./uploads/file/" + code + "/" + fileGenre.Name + "/" + dst
  283. projectFile := dao.ProjectFile{
  284. ProjectCode: code,
  285. Name: dst,
  286. Path: path,
  287. Genre: genreId,
  288. }
  289. // gin 简单做了封装,拷贝了文件流
  290. if err := c.SaveUploadedFile(file, path); err != nil {
  291. response.FailWithMessage("上传失败", c)
  292. return
  293. }
  294. err = projectService.CreateProjectFile(projectFile)
  295. if err != nil {
  296. response.FailWithMessage("上传失败", c)
  297. return
  298. }
  299. }
  300. response.OkWithMessage("上传成功", c)
  301. }
  302. func (pa *ProjectApi) CreateProjectState(c *gin.Context) {
  303. var projectState dao.ProjectState
  304. err := c.ShouldBindJSON(&projectState)
  305. if err != nil {
  306. response.FailWithMessage("失败", c)
  307. global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
  308. return
  309. }
  310. err = projectService.CreateProjectState(projectState)
  311. if err != nil {
  312. response.FailWithMessage("失败", c)
  313. global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
  314. return
  315. }
  316. response.OkWithMessage("新增成功", c)
  317. }
  318. func (pa *ProjectApi) CreateWorkingHours(c *gin.Context) {
  319. var working dao.ProjectWorkingHours
  320. err := c.ShouldBindJSON(&working)
  321. if err != nil {
  322. response.FailWithMessage(err.Error(), c)
  323. return
  324. }
  325. err = projectService.CreateOrUpdateWorkingHours(working)
  326. if err != nil {
  327. response.FailWithMessage(err.Error(), c)
  328. return
  329. }
  330. response.OkWithMessage("更新成功", c)
  331. }
  332. func (pa *ProjectApi) CreateCollection(c *gin.Context) {
  333. var collection dao.Collection
  334. err := c.ShouldBindJSON(&collection)
  335. if err != nil {
  336. response.FailWithMessage("错误", c)
  337. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  338. return
  339. }
  340. err = projectService.CreateCollection(collection)
  341. if err != nil {
  342. response.FailWithMessage("错误", c)
  343. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  344. return
  345. }
  346. response.OkWithMessage("创建成功", c)
  347. }
  348. func (pa *ProjectApi) CreateReimbursement(c *gin.Context) {
  349. var reimbursement dao.Reimbursement
  350. err := c.ShouldBindJSON(&reimbursement)
  351. if err != nil {
  352. response.FailWithMessage("失败", c)
  353. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  354. return
  355. }
  356. err = projectService.CreateReimbursement(reimbursement)
  357. if err != nil {
  358. response.FailWithMessage("失败", c)
  359. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  360. return
  361. }
  362. response.OkWithMessage("新建成功", c)
  363. }
  364. func (pa *ProjectApi) UpdateProject(c *gin.Context) {
  365. var project dao.Project
  366. err := c.ShouldBindJSON(&project)
  367. if err != nil {
  368. response.FailWithMessage(err.Error(), c)
  369. return
  370. }
  371. err = projectService.UpdateProject(project)
  372. if err != nil {
  373. response.FailWithMessage(err.Error(), c)
  374. return
  375. }
  376. response.OkWithMessage("更新成功", c)
  377. }
  378. func (pa *ProjectApi) UpdateProjectState(c *gin.Context) {
  379. var projectState dao.ProjectState
  380. err := c.ShouldBindJSON(&projectState)
  381. if err != nil {
  382. response.FailWithMessage("失败", c)
  383. global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
  384. return
  385. }
  386. err = projectService.UpdateProjectState(projectState)
  387. if err != nil {
  388. response.FailWithMessage("失败", c)
  389. global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
  390. return
  391. }
  392. response.OkWithMessage("更新成功", c)
  393. }
  394. func (pa *ProjectApi) UpdateWorkingHours(c *gin.Context) {
  395. var working dao.ProjectWorkingHours
  396. err := c.ShouldBindJSON(&working)
  397. if err != nil {
  398. response.FailWithMessage(err.Error(), c)
  399. return
  400. }
  401. err = projectService.UpdateWorkingHours(working)
  402. if err != nil {
  403. response.FailWithMessage(err.Error(), c)
  404. return
  405. }
  406. response.OkWithMessage("更新成功", c)
  407. }
  408. func (pa *ProjectApi) UpdateCollection(c *gin.Context) {
  409. var collection dao.Collection
  410. err := c.ShouldBindJSON(&collection)
  411. if err != nil {
  412. response.FailWithMessage("错误", c)
  413. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  414. return
  415. }
  416. err = projectService.UpdateCollection(collection)
  417. if err != nil {
  418. response.FailWithMessage("错误", c)
  419. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  420. }
  421. response.OkWithMessage("修改成功", c)
  422. }
  423. func (pa *ProjectApi) UpdateReimbursement(c *gin.Context) {
  424. var reimbursement dao.Reimbursement
  425. err := c.ShouldBindJSON(&reimbursement)
  426. if err != nil {
  427. response.FailWithMessage("失败", c)
  428. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  429. return
  430. }
  431. err = projectService.UpdateReimbursement(reimbursement)
  432. if err != nil {
  433. response.FailWithMessage("失败", c)
  434. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  435. return
  436. }
  437. response.OkWithMessage("修改成功", c)
  438. }
  439. func (pa *ProjectApi) DeleteProject(c *gin.Context) {
  440. code := c.Query("code")
  441. if code == "" {
  442. response.FailWithMessage("编号不能为空", c)
  443. return
  444. }
  445. err := projectService.DeleteProject(code)
  446. if err != nil {
  447. response.FailWithMessage(err.Error(), c)
  448. return
  449. }
  450. response.OkWithMessage("删除成功", c)
  451. }
  452. func (pa *ProjectApi) DeleteProjectFile(c *gin.Context) {
  453. id := c.Query("id")
  454. path := c.Query("path")
  455. i, err := strconv.Atoi(id)
  456. if err != nil {
  457. response.FailWithMessage(err.Error(), c)
  458. return
  459. }
  460. err = os.Remove(path)
  461. if err != nil {
  462. // 如果发生错误,打印错误信息
  463. response.FailWithMessage("删除文件时发生错误", c)
  464. global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
  465. return
  466. }
  467. err = projectService.DeleteProjectFile(uint(i))
  468. if err != nil {
  469. response.FailWithMessage(err.Error(), c)
  470. return
  471. }
  472. response.OkWithMessage("删除成功", c)
  473. }
  474. func (pa *ProjectApi) DeleteProjectFiles(c *gin.Context) {
  475. var info request.SearchProjectFileList
  476. err := c.ShouldBindJSON(&info)
  477. fmt.Println(info)
  478. if err != nil {
  479. response.FailWithMessage(err.Error(), c)
  480. return
  481. }
  482. files, err := projectService.QueryFilesByNameOrGenre(info)
  483. if err != nil {
  484. response.FailWithMessage("错误", c)
  485. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  486. return
  487. }
  488. fmt.Println(files)
  489. for _, file := range files {
  490. err = os.Remove(file.Path)
  491. if err != nil {
  492. // 如果发生错误,打印错误信息
  493. response.FailWithMessage("删除文件时发生错误", c)
  494. global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
  495. return
  496. }
  497. err = projectService.DeleteProjectFile(file.ID)
  498. if err != nil {
  499. response.FailWithMessage(err.Error(), c)
  500. return
  501. }
  502. }
  503. response.OkWithMessage("删除成功", c)
  504. }
  505. func (pa *ProjectApi) DeleteProjectState(c *gin.Context) {
  506. var projectState dao.ProjectState
  507. err := c.ShouldBindJSON(&projectState)
  508. if err != nil {
  509. response.FailWithMessage("失败", c)
  510. global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
  511. return
  512. }
  513. err = projectService.DeleteProjectState(projectState)
  514. if err != nil {
  515. response.FailWithMessage("失败", c)
  516. global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
  517. return
  518. }
  519. response.OkWithMessage("删除成功", c)
  520. }
  521. func (pa *ProjectApi) DeleteWorkingHours(c *gin.Context) {
  522. var working dao.ProjectWorkingHours
  523. err := c.ShouldBindJSON(&working)
  524. if err != nil {
  525. response.FailWithMessage(err.Error(), c)
  526. return
  527. }
  528. err = projectService.DeleteWorkingHours(working)
  529. if err != nil {
  530. response.FailWithMessage(err.Error(), c)
  531. return
  532. }
  533. response.OkWithMessage("删除成功", c)
  534. }
  535. func (pa *ProjectApi) DeleteCollection(c *gin.Context) {
  536. var collection dao.Collection
  537. err := c.ShouldBindJSON(&collection)
  538. if err != nil {
  539. response.FailWithMessage("错误", c)
  540. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  541. return
  542. }
  543. err = projectService.DeleteCollection(collection)
  544. if err != nil {
  545. response.FailWithMessage("错误", c)
  546. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  547. return
  548. }
  549. response.OkWithMessage("删除成功", c)
  550. }
  551. func (pa *ProjectApi) DeleteReimbursement(c *gin.Context) {
  552. var reimbursement dao.Reimbursement
  553. err := c.ShouldBindJSON(&reimbursement)
  554. if err != nil {
  555. response.FailWithMessage("失败", c)
  556. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  557. return
  558. }
  559. err = projectService.DeleteReimbursement(reimbursement)
  560. if err != nil {
  561. response.FailWithMessage("失败", c)
  562. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  563. return
  564. }
  565. response.OkWithMessage("删除成功", c)
  566. }
  567. func (pa *ProjectApi) ProjectFilesDownload(c *gin.Context) {
  568. var info request.SearchProjectFileList
  569. err := c.ShouldBindJSON(&info)
  570. if err != nil {
  571. response.FailWithMessage("错误", c)
  572. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  573. return
  574. }
  575. files, err := projectService.QueryFilesByNameOrGenre(info)
  576. if err != nil {
  577. response.FailWithMessage("错误", c)
  578. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  579. return
  580. }
  581. zipBuffer := &bytes.Buffer{}
  582. zipWriter := zip.NewWriter(zipBuffer)
  583. for _, file := range files {
  584. err := addFileToZip(zipWriter, file.Path)
  585. if err != nil {
  586. response.FailWithMessage("错误", c)
  587. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  588. return
  589. }
  590. }
  591. // 确保所有文件都被写入
  592. if err := zipWriter.Close(); err != nil {
  593. response.FailWithMessage("错误", c)
  594. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  595. return
  596. }
  597. // 设置响应头
  598. c.Header("Content-Description", "File Transfer")
  599. c.Header("Content-Type", "application/zip")
  600. c.Header("Content-Transfer-Encoding", "binary")
  601. c.Header("Content-Disposition", "filename=files.zip")
  602. c.Header("Cache-Control", "must-revalidate")
  603. c.Header("Pragma", "public")
  604. // 发送文件
  605. c.Data(http.StatusOK, "application/zip", zipBuffer.Bytes())
  606. }
  607. // 添加文件道zip中
  608. func addFileToZip(w *zip.Writer, filename string) error {
  609. // 打开文件
  610. f, err := os.Open(filename)
  611. if err != nil {
  612. return err
  613. }
  614. defer f.Close()
  615. // 获取文件信息
  616. fileInfo, err := f.Stat()
  617. if err != nil {
  618. return err
  619. }
  620. header, err := zip.FileInfoHeader(fileInfo)
  621. if err != nil {
  622. return err
  623. }
  624. // 使用文件的实际文件名
  625. header.Name = filepath.Base(filename)
  626. // 写入文件到zip
  627. writer, err := w.CreateHeader(header)
  628. if err != nil {
  629. return err
  630. }
  631. _, err = io.Copy(writer, f)
  632. if err != nil {
  633. return err
  634. }
  635. return err
  636. }