voice.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package controllers
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/file"
  6. "github.com/rdlucklib/rdluck_tools/http"
  7. "eta/eta_api/models"
  8. "eta/eta_api/services"
  9. "eta/eta_api/utils"
  10. "io/ioutil"
  11. "os"
  12. "path"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. // VoiceController 音频
  18. type VoiceController struct {
  19. BaseAuthController
  20. }
  21. // Upload
  22. // @Title 音频上传
  23. // @Description 音频上传接口
  24. // @Param file query file true "文件"
  25. // @Param ReportId query int true "报告ID"
  26. // @Success Ret=200 上传成功
  27. // @router /upload [post]
  28. func (this *VoiceController) Upload() {
  29. br := new(models.BaseResponse).Init()
  30. defer func() {
  31. this.Data["json"] = br
  32. this.ServeJSON()
  33. }()
  34. f, h, err := this.GetFile("file")
  35. if err != nil {
  36. br.Msg = "获取资源信息失败"
  37. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  38. return
  39. }
  40. reportId, err := this.GetInt("ReportId")
  41. if err != nil {
  42. br.Msg = "获取资源信息失败"
  43. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  44. return
  45. }
  46. report, err := models.GetReportItemById(reportId)
  47. if err != nil {
  48. br.Msg = "获取报告信息失败"
  49. br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
  50. return
  51. }
  52. ext := path.Ext(h.Filename)
  53. dateDir := time.Now().Format("20060102")
  54. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  55. err = os.MkdirAll(uploadDir, 777)
  56. if err != nil {
  57. br.Msg = "存储目录创建失败"
  58. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  59. return
  60. }
  61. randStr := utils.GetRandStringNoSpecialChar(28)
  62. fileName := randStr + ext
  63. fpath := uploadDir + "/" + fileName
  64. defer f.Close() //关闭上传文件
  65. err = this.SaveToFile("file", fpath)
  66. if err != nil {
  67. br.Msg = "文件上传失败"
  68. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  69. return
  70. }
  71. resourceUrl := ``
  72. //上传到阿里云 和 minio
  73. if utils.Object_Storage_Client == "minio" {
  74. resourceUrl, err = services.UploadAudioToMinIo(fileName, fpath)
  75. if err != nil {
  76. br.Msg = "文件上传失败"
  77. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  78. return
  79. }
  80. } else {
  81. resourceUrl, err = services.UploadAudioAliyun(fileName, fpath)
  82. if err != nil {
  83. br.Msg = "文件上传失败"
  84. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  85. return
  86. }
  87. }
  88. defer func() {
  89. os.Remove(fpath)
  90. }()
  91. item := new(models.Resource)
  92. item.ResourceUrl = resourceUrl
  93. item.ResourceType = 2
  94. item.CreateTime = time.Now()
  95. newId, err := models.AddResource(item)
  96. if err != nil {
  97. br.Msg = "资源上传失败"
  98. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  99. return
  100. }
  101. playSeconds, err := utils.GetVideoPlaySeconds(fpath)
  102. if err != nil {
  103. br.Msg = "获取音频时间失败"
  104. br.ErrMsg = "获取音频时间失败,Err:" + err.Error()
  105. return
  106. }
  107. createTime := report.CreateTime.Format("0102")
  108. videoName := report.Title + "(" + createTime + ")"
  109. fileBody, err := ioutil.ReadFile(fpath)
  110. videoSize := len(fileBody)
  111. sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
  112. sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
  113. err = models.ModifyReportVideo(reportId, resourceUrl, videoName, sizeStr, playSeconds)
  114. if err != nil {
  115. br.Msg = "上传失败"
  116. br.ErrMsg = "上传失败,Err:" + err.Error()
  117. return
  118. }
  119. resp := new(models.ResourceResp)
  120. resp.Id = newId
  121. resp.ResourceUrl = resourceUrl
  122. br.Msg = "上传成功"
  123. br.Ret = 200
  124. br.Success = true
  125. br.Data = resp
  126. return
  127. }
  128. // VoiceCommonController 音频
  129. type VoiceCommonController struct {
  130. BaseCommonController
  131. }
  132. // Download
  133. // @Title 音频下载
  134. // @Description 音频下载接口
  135. // @Param ReportId query int true "报告ID"
  136. // @Success Ret=200 下载成功
  137. // @router /download [get]
  138. func (this *VoiceCommonController) Download() {
  139. br := new(models.BaseResponse).Init()
  140. defer func() {
  141. this.Data["json"] = br
  142. this.ServeJSON()
  143. }()
  144. reportId, err := this.GetInt("ReportId")
  145. if err != nil {
  146. br.Msg = "参数错误"
  147. br.ErrMsg = "获取,ReportId,Err:" + err.Error()
  148. return
  149. }
  150. report, err := models.GetReportById(reportId)
  151. if err != nil {
  152. br.Msg = "获取信息失败"
  153. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  154. return
  155. }
  156. savePath := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".mp3"
  157. fileBody, err := http.Get(report.VideoUrl)
  158. if err != nil {
  159. br.Msg = "获取信息失败"
  160. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  161. return
  162. }
  163. err = file.SaveFile(fileBody, savePath)
  164. if err != nil {
  165. br.Msg = "保存信息失败"
  166. br.ErrMsg = "保存信息失败,Err:" + err.Error()
  167. return
  168. }
  169. fileName := report.VideoName + ".mp3"
  170. this.Ctx.Output.Download(savePath, fileName)
  171. defer func() {
  172. os.Remove(savePath)
  173. }()
  174. br.Ret = 200
  175. br.Msg = "下载成功"
  176. br.Success = true
  177. return
  178. }
  179. // ReportChapterDownload
  180. // @Title 报告章节列表音频下载
  181. // @Description 音频下载接口
  182. // @Param ChapterIds query string true "章节IDs"
  183. // @Success Ret=200 下载成功
  184. // @router /report/download [get]
  185. func (this *VoiceCommonController) ReportChapterDownload() {
  186. br := new(models.BaseResponse).Init()
  187. defer func() {
  188. this.Data["json"] = br
  189. this.ServeJSON()
  190. }()
  191. strChapterIds := this.GetString("ChapterIds")
  192. if strChapterIds == "" {
  193. br.Msg = "参数错误"
  194. return
  195. }
  196. chapterIds := make([]int, 0)
  197. chapterIdArr := strings.Split(strChapterIds, ",")
  198. for _, v := range chapterIdArr {
  199. id, e := strconv.Atoi(v)
  200. if e != nil {
  201. br.Msg = "参数有误"
  202. br.ErrMsg = "章节ID有误, Err: " + e.Error()
  203. return
  204. }
  205. chapterIds = append(chapterIds, id)
  206. }
  207. if len(chapterIds) == 0 {
  208. br.Msg = "参数有误"
  209. return
  210. }
  211. videoList, err := models.GetReportChapterVideoListByChapterIds(chapterIds)
  212. if err != nil {
  213. br.Msg = "获取音频列表失败"
  214. br.ErrMsg = "获取音频列表失败, Err: " + err.Error()
  215. return
  216. }
  217. if len(videoList) > 0 {
  218. reportId := videoList[0].ReportId
  219. reportInfo, err := models.GetReportById(reportId)
  220. if err != nil {
  221. br.Msg = "报告信息有误"
  222. br.ErrMsg = "获取报告信息失败, Err: " + err.Error()
  223. return
  224. }
  225. // 创建zip
  226. zipName := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".zip"
  227. savePath := zipName
  228. zipFile, err := os.Create(zipName)
  229. if err != nil {
  230. return
  231. }
  232. zipWriter := zip.NewWriter(zipFile)
  233. // 生成zip过程中报错关闭
  234. defer func() {
  235. if err != nil {
  236. zipWriter.Close()
  237. zipFile.Close()
  238. }
  239. os.Remove(savePath)
  240. }()
  241. // 获取音频,写入zip
  242. for i := 0; i < len(videoList); i++ {
  243. item := videoList[i]
  244. if item.VideoName == "" || item.VideoUrl == "" {
  245. continue
  246. }
  247. // 音频文件后缀
  248. ext := path.Ext(item.VideoUrl)
  249. ioWriter, err := zipWriter.Create(fmt.Sprintf("%s%s", item.VideoName, ext))
  250. if err != nil {
  251. if os.IsPermission(err) {
  252. fmt.Println("权限不足: ", err)
  253. return
  254. }
  255. return
  256. }
  257. var content []byte
  258. content, err = http.Get(item.VideoUrl)
  259. if err != nil {
  260. content = []byte("")
  261. }
  262. ioWriter.Write(content)
  263. }
  264. // 生成zip后关闭,否则下载文件会损坏
  265. zipWriter.Close()
  266. zipFile.Close()
  267. this.Ctx.Output.Download(savePath, fmt.Sprintf("%s.zip", reportInfo.Title))
  268. }
  269. br.Ret = 200
  270. br.Msg = "下载成功"
  271. br.Success = true
  272. return
  273. }