voice.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. //上传到阿里云
  72. resourceUrl, err := services.UploadAudioAliyun(fileName, fpath)
  73. if err != nil {
  74. br.Msg = "文件上传失败"
  75. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  76. return
  77. }
  78. defer func() {
  79. os.Remove(fpath)
  80. }()
  81. item := new(models.Resource)
  82. item.ResourceUrl = resourceUrl
  83. item.ResourceType = 2
  84. item.CreateTime = time.Now()
  85. newId, err := models.AddResource(item)
  86. if err != nil {
  87. br.Msg = "资源上传失败"
  88. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  89. return
  90. }
  91. playSeconds, err := utils.GetVideoPlaySeconds(fpath)
  92. if err != nil {
  93. br.Msg = "获取音频时间失败"
  94. br.ErrMsg = "获取音频时间失败,Err:" + err.Error()
  95. return
  96. }
  97. createTime := report.CreateTime.Format("0102")
  98. videoName := report.Title + "(" + createTime + ")"
  99. fileBody, err := ioutil.ReadFile(fpath)
  100. videoSize := len(fileBody)
  101. sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
  102. sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
  103. err = models.ModifyReportVideo(reportId, resourceUrl, videoName, sizeStr, playSeconds)
  104. if err != nil {
  105. br.Msg = "上传失败"
  106. br.ErrMsg = "上传失败,Err:" + err.Error()
  107. return
  108. }
  109. resp := new(models.ResourceResp)
  110. resp.Id = newId
  111. resp.ResourceUrl = resourceUrl
  112. br.Msg = "上传成功"
  113. br.Ret = 200
  114. br.Success = true
  115. br.Data = resp
  116. return
  117. }
  118. // VoiceCommonController 音频
  119. type VoiceCommonController struct {
  120. BaseCommonController
  121. }
  122. // Download
  123. // @Title 音频下载
  124. // @Description 音频下载接口
  125. // @Param ReportId query int true "报告ID"
  126. // @Success Ret=200 下载成功
  127. // @router /download [get]
  128. func (this *VoiceCommonController) Download() {
  129. br := new(models.BaseResponse).Init()
  130. defer func() {
  131. this.Data["json"] = br
  132. this.ServeJSON()
  133. }()
  134. reportId, err := this.GetInt("ReportId")
  135. if err != nil {
  136. br.Msg = "参数错误"
  137. br.ErrMsg = "获取,ReportId,Err:" + err.Error()
  138. return
  139. }
  140. report, err := models.GetReportById(reportId)
  141. if err != nil {
  142. br.Msg = "获取信息失败"
  143. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  144. return
  145. }
  146. savePath := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".mp3"
  147. fileBody, err := http.Get(report.VideoUrl)
  148. if err != nil {
  149. br.Msg = "获取信息失败"
  150. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  151. return
  152. }
  153. err = file.SaveFile(fileBody, savePath)
  154. if err != nil {
  155. br.Msg = "保存信息失败"
  156. br.ErrMsg = "保存信息失败,Err:" + err.Error()
  157. return
  158. }
  159. fileName := report.VideoName + ".mp3"
  160. this.Ctx.Output.Download(savePath, fileName)
  161. defer func() {
  162. os.Remove(savePath)
  163. }()
  164. br.Ret = 200
  165. br.Msg = "下载成功"
  166. br.Success = true
  167. return
  168. }
  169. // ReportChapterDownload
  170. // @Title 报告章节列表音频下载
  171. // @Description 音频下载接口
  172. // @Param ChapterIds query string true "章节IDs"
  173. // @Success Ret=200 下载成功
  174. // @router /report/download [get]
  175. func (this *VoiceCommonController) ReportChapterDownload() {
  176. br := new(models.BaseResponse).Init()
  177. defer func() {
  178. this.Data["json"] = br
  179. this.ServeJSON()
  180. }()
  181. strChapterIds := this.GetString("ChapterIds")
  182. if strChapterIds == "" {
  183. br.Msg = "参数错误"
  184. return
  185. }
  186. chapterIds := make([]int, 0)
  187. chapterIdArr := strings.Split(strChapterIds, ",")
  188. for _, v := range chapterIdArr {
  189. id, e := strconv.Atoi(v)
  190. if e != nil {
  191. br.Msg = "参数有误"
  192. br.ErrMsg = "章节ID有误, Err: " + e.Error()
  193. return
  194. }
  195. chapterIds = append(chapterIds, id)
  196. }
  197. if len(chapterIds) == 0 {
  198. br.Msg = "参数有误"
  199. return
  200. }
  201. videoList, err := models.GetReportChapterVideoListByChapterIds(chapterIds)
  202. if err != nil {
  203. br.Msg = "获取音频列表失败"
  204. br.ErrMsg = "获取音频列表失败, Err: " + err.Error()
  205. return
  206. }
  207. if len(videoList) > 0 {
  208. reportId := videoList[0].ReportId
  209. reportInfo, err := models.GetReportById(reportId)
  210. if err != nil {
  211. br.Msg = "报告信息有误"
  212. br.ErrMsg = "获取报告信息失败, Err: " + err.Error()
  213. return
  214. }
  215. // 创建zip
  216. zipName := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".zip"
  217. savePath := zipName
  218. zipFile, err := os.Create(zipName)
  219. if err != nil {
  220. return
  221. }
  222. zipWriter := zip.NewWriter(zipFile)
  223. // 生成zip过程中报错关闭
  224. defer func() {
  225. if err != nil {
  226. zipWriter.Close()
  227. zipFile.Close()
  228. }
  229. os.Remove(savePath)
  230. }()
  231. // 获取音频,写入zip
  232. for i := 0; i < len(videoList); i++ {
  233. item := videoList[i]
  234. if item.VideoName == "" || item.VideoUrl == "" {
  235. continue
  236. }
  237. // 音频文件后缀
  238. ext := path.Ext(item.VideoUrl)
  239. ioWriter, err := zipWriter.Create(fmt.Sprintf("%s%s", item.VideoName, ext))
  240. if err != nil {
  241. if os.IsPermission(err) {
  242. fmt.Println("权限不足: ", err)
  243. return
  244. }
  245. return
  246. }
  247. var content []byte
  248. content, err = http.Get(item.VideoUrl)
  249. if err != nil {
  250. content = []byte("")
  251. }
  252. ioWriter.Write(content)
  253. }
  254. // 生成zip后关闭,否则下载文件会损坏
  255. zipWriter.Close()
  256. zipFile.Close()
  257. this.Ctx.Output.Download(savePath, fmt.Sprintf("%s.zip", reportInfo.Title))
  258. }
  259. br.Ret = 200
  260. br.Msg = "下载成功"
  261. br.Success = true
  262. return
  263. }