resource.go 107 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. package controllers
  2. import (
  3. "bufio"
  4. "encoding/base64"
  5. "eta/eta_api/models"
  6. "eta/eta_api/services"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "github.com/h2non/filetype"
  10. "github.com/kgiannakakis/mp3duration/src/mp3duration"
  11. "io"
  12. "io/ioutil"
  13. "net/http"
  14. "os"
  15. "path"
  16. "regexp"
  17. "strings"
  18. "time"
  19. )
  20. // 资源管理-图片上传,合同上传等
  21. type ResourceController struct {
  22. //BaseAuthController
  23. BaseCommonController
  24. }
  25. // ResourceAuthController 文件资源
  26. type ResourceAuthController struct {
  27. BaseAuthController
  28. }
  29. // @Title 图片上传
  30. // @Description 图片上传接口
  31. // @Param file query file true "文件"
  32. // @Success 200 {object} models.ResourceResp
  33. // @router /image/upload [post]
  34. func (this *ResourceController) Upload() {
  35. br := new(models.BaseResponse).Init()
  36. defer func() {
  37. this.Data["json"] = br
  38. this.ServeJSON()
  39. }()
  40. f, h, err := this.GetFile("file")
  41. if err != nil {
  42. br.Msg = "获取资源信息失败"
  43. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  44. return
  45. }
  46. fileData, e := ioutil.ReadAll(f)
  47. if e != nil {
  48. br.Msg = "上传失败"
  49. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  50. return
  51. }
  52. pass := filetype.IsImage(fileData)
  53. if !pass {
  54. br.Msg = "文件格式有误"
  55. br.ErrMsg = "文件格式有误"
  56. return
  57. }
  58. uploadFileName := h.Filename //上传的文件名
  59. ext := path.Ext(h.Filename)
  60. dateDir := time.Now().Format("20060102")
  61. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  62. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  63. if err != nil {
  64. br.Msg = "存储目录创建失败"
  65. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  66. return
  67. }
  68. randStr := utils.GetRandStringNoSpecialChar(28)
  69. fileName := randStr + ext
  70. fpath := uploadDir + "/" + fileName
  71. defer f.Close() //关闭上传文件
  72. err = this.SaveToFile("file", fpath)
  73. if err != nil {
  74. br.Msg = "文件上传失败"
  75. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  76. return
  77. }
  78. resourceUrl := ``
  79. //上传到阿里云 和 minio
  80. //if utils.ObjectStorageClient == "minio" {
  81. // resourceUrl, err = services.UploadImgToMinIo(fileName, fpath)
  82. // if err != nil {
  83. // br.Msg = "文件上传失败"
  84. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  85. // return
  86. // }
  87. //} else {
  88. // resourceUrl, err = services.UploadAliyunV2(fileName, fpath)
  89. // if err != nil {
  90. // br.Msg = "文件上传失败"
  91. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  92. // return
  93. // }
  94. //}
  95. ossClient := services.NewOssClient()
  96. if ossClient == nil {
  97. br.Msg = "上传失败"
  98. br.ErrMsg = "初始化OSS服务失败"
  99. return
  100. }
  101. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  102. if err != nil {
  103. br.Msg = "文件上传失败"
  104. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  105. return
  106. }
  107. defer func() {
  108. os.Remove(fpath)
  109. }()
  110. item := new(models.Resource)
  111. item.ResourceUrl = resourceUrl
  112. item.ResourceType = 1
  113. item.CreateTime = time.Now()
  114. newId, err := models.AddResource(item)
  115. if err != nil {
  116. br.Msg = "资源上传失败"
  117. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  118. return
  119. }
  120. resp := models.ResourceResp{
  121. Id: newId,
  122. ResourceUrl: resourceUrl,
  123. ResourceName: uploadFileName,
  124. }
  125. br.Msg = "上传成功"
  126. br.Ret = 200
  127. br.Success = true
  128. br.Data = resp
  129. return
  130. }
  131. // @Title 视频上传
  132. // @Description 视频上传接口
  133. // @Param file query file true "文件"
  134. // @Success 200 新增成功
  135. // @router /video/upload [post]
  136. func (this *ResourceController) VideoUpload() {
  137. utils.FileLog.Info("start VideoUpload ")
  138. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  139. br := new(models.BaseResponse).Init()
  140. defer func() {
  141. this.Data["json"] = br
  142. this.ServeJSON()
  143. }()
  144. f, h, err := this.GetFile("file")
  145. if err != nil {
  146. br.Msg = "获取资源信息失败"
  147. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  148. return
  149. }
  150. fileData, e := ioutil.ReadAll(f)
  151. if e != nil {
  152. br.Msg = "上传失败"
  153. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  154. return
  155. }
  156. pass := filetype.IsVideo(fileData)
  157. if !pass {
  158. br.Msg = "文件格式有误"
  159. br.ErrMsg = "文件格式有误"
  160. return
  161. }
  162. ext := path.Ext(h.Filename)
  163. dateDir := time.Now().Format("20060102")
  164. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  165. //uploadDir := "./" + dateDir
  166. fmt.Println(uploadDir)
  167. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  168. if err != nil {
  169. br.Msg = "存储目录创建失败"
  170. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  171. return
  172. }
  173. randStr := utils.GetRandStringNoSpecialChar(28)
  174. fileName := randStr + ext
  175. fpath := uploadDir + "/" + fileName
  176. defer f.Close() //关闭上传文件
  177. utils.FileLog.Info("start save")
  178. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  179. utils.FileLog.Info("fpath %s:", fpath)
  180. fileHandle, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModeAppend)
  181. if err != nil {
  182. br.Msg = "创建文件失败"
  183. br.ErrMsg = "创建文件失败,Err:" + err.Error()
  184. return
  185. }
  186. defer fileHandle.Close()
  187. //循环读取
  188. for {
  189. buffer := make([]byte, 4096)
  190. _, err := f.Read(buffer)
  191. //如果错误信息是其他类型的,则直接panic
  192. if err != nil && err != io.EOF {
  193. br.Msg = "上传失败"
  194. br.ErrMsg = "读取文件内容失败,Err:" + err.Error()
  195. return
  196. }
  197. //注意,错误信息是以io包的EOF时,表示读取到文件末尾
  198. if err == io.EOF {
  199. break
  200. }
  201. // NewWriter 默认缓冲区大小是 4096
  202. // 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
  203. buf := bufio.NewWriter(fileHandle)
  204. // 字节写入
  205. // 字符串写入
  206. buf.WriteString(string(buffer))
  207. // 将缓冲中的数据写入
  208. err = buf.Flush()
  209. if err != nil {
  210. br.Msg = "上传失败"
  211. br.ErrMsg = "写入文件内容失败,Err:" + err.Error()
  212. return
  213. }
  214. }
  215. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  216. utils.FileLog.Info("end save")
  217. //err = this.SaveToFile("file", fpath)
  218. //if err != nil {
  219. // br.Msg = "文件上传失败"
  220. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  221. // return
  222. //}
  223. /*
  224. fmt.Println("start")
  225. fmt.Println(time.Now())
  226. tofile:="./20201123.mp4"
  227. fromFile:="./第五期下.mp4"
  228. f, err := os.Open(fromFile)
  229. defer f.Close() //注意要关闭文件
  230. fileHandle, err := os.OpenFile(tofile, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0666)
  231. if err != nil {
  232. fmt.Println("open file error :", err)
  233. return
  234. }
  235. defer fileHandle.Close()
  236. if err != nil {
  237. panic(err)
  238. } else {
  239. //循环读取
  240. for {
  241. buffer := make([]byte, 4096)
  242. _, err := f.Read(buffer)
  243. //如果错误信息是其他类型的,则直接panic
  244. if err != nil && err != io.EOF {
  245. panic(err)
  246. }
  247. //注意,错误信息是以io包的EOF时,表示读取到文件末尾
  248. if err == io.EOF {
  249. fmt.Println("读取完毕")
  250. break
  251. }
  252. // NewWriter 默认缓冲区大小是 4096
  253. // 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
  254. buf := bufio.NewWriter(fileHandle)
  255. // 字节写入
  256. // 字符串写入
  257. buf.WriteString(string(buffer))
  258. // 将缓冲中的数据写入
  259. err = buf.Flush()
  260. if err != nil {
  261. fmt.Println("flush error :"+err.Error())
  262. return
  263. }
  264. }
  265. }
  266. */
  267. utils.FileLog.Info("start update oss ")
  268. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  269. //savePath := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
  270. //savePath += fileName
  271. defer func() {
  272. _ = os.Remove(fpath)
  273. }()
  274. //上传到阿里云 和 minio
  275. resourceUrl := ``
  276. //if utils.ObjectStorageClient == "minio" {
  277. // err = services.UploadVideoToMinIo(fileName, fpath, savePath)
  278. // if err != nil {
  279. // br.Msg = "文件上传失败"
  280. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  281. // return
  282. // }
  283. // resourceUrl = utils.MinIoImghost + savePath
  284. //} else {
  285. // err = services.UploadVideoAliyun(fileName, fpath, savePath)
  286. // if err != nil {
  287. // br.Msg = "文件上传失败"
  288. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  289. // return
  290. // }
  291. // resourceUrl = utils.Imghost + savePath
  292. //}
  293. ossClient := services.NewOssClient()
  294. if ossClient == nil {
  295. br.Msg = "上传失败"
  296. br.ErrMsg = "初始化OSS服务失败"
  297. return
  298. }
  299. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  300. if err != nil {
  301. br.Msg = "文件上传失败"
  302. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  303. return
  304. }
  305. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  306. utils.FileLog.Info("end update oss ")
  307. item := new(models.Resource)
  308. item.ResourceUrl = resourceUrl
  309. item.ResourceType = 3
  310. item.CreateTime = time.Now()
  311. newId, err := models.AddResource(item)
  312. if err != nil {
  313. br.Msg = "资源上传失败"
  314. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  315. return
  316. }
  317. resp := new(models.ResourceResp)
  318. resp.Id = newId
  319. resp.ResourceUrl = resourceUrl
  320. utils.FileLog.Info("start GetMP4Duration ")
  321. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  322. duration, err := services.GetMP4Duration(f)
  323. if err != nil {
  324. panic(err)
  325. }
  326. utils.FileLog.Info("end GetMP4Duration ")
  327. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  328. resp.PlaySeconds = duration
  329. br.Msg = "上传成功"
  330. br.Ret = 200
  331. br.Success = true
  332. br.Data = resp
  333. utils.FileLog.Info("end VideoUpload ")
  334. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  335. return
  336. }
  337. // VoiceUpload
  338. // @Title 音频上传
  339. // @Description 音频上传接口
  340. // @Param file query file true "文件"
  341. // @Success 200 {object} models.ResourceResp
  342. // @router /voice/upload [post]
  343. func (this *ResourceController) VoiceUpload() {
  344. utils.FileLog.Info("start VoiceUpload ")
  345. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  346. br := new(models.BaseResponse).Init()
  347. defer func() {
  348. this.Data["json"] = br
  349. this.ServeJSON()
  350. }()
  351. f, h, err := this.GetFile("file")
  352. if err != nil {
  353. br.Msg = "获取资源信息失败"
  354. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  355. return
  356. }
  357. uploadFileName := h.Filename //上传的文件名
  358. fileData, e := ioutil.ReadAll(f)
  359. if e != nil {
  360. br.Msg = "上传失败"
  361. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  362. return
  363. }
  364. pass := filetype.IsAudio(fileData)
  365. if !pass {
  366. br.Msg = "文件格式有误"
  367. br.ErrMsg = "文件格式有误"
  368. return
  369. }
  370. ext := path.Ext(h.Filename)
  371. dateDir := time.Now().Format("20060102")
  372. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  373. //uploadDir := "./" + dateDir
  374. fmt.Println(uploadDir)
  375. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  376. if err != nil {
  377. br.Msg = "存储目录创建失败"
  378. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  379. return
  380. }
  381. randStr := utils.GetRandStringNoSpecialChar(28)
  382. fileName := randStr + ext
  383. fpath := uploadDir + "/" + fileName
  384. defer f.Close() //关闭上传文件
  385. utils.FileLog.Info("start save")
  386. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  387. utils.FileLog.Info(fmt.Sprintf("fpath %s:", fpath))
  388. fileHandle, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
  389. if err != nil {
  390. br.Msg = "创建文件失败"
  391. br.ErrMsg = "创建文件失败,Err:" + err.Error()
  392. return
  393. }
  394. defer fileHandle.Close()
  395. localFileBuffer := make([]byte, 0)
  396. //循环读取
  397. for {
  398. buffer := make([]byte, 4096)
  399. maxLen, err := f.Read(buffer)
  400. //如果错误信息是其他类型的,则直接panic
  401. if err != nil && err != io.EOF {
  402. br.Msg = "上传失败"
  403. br.ErrMsg = "读取文件内容失败,Err:" + err.Error()
  404. return
  405. }
  406. //注意,错误信息是以io包的EOF时,表示读取到文件末尾
  407. if err == io.EOF {
  408. break
  409. }
  410. // NewWriter 默认缓冲区大小是 4096
  411. // 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
  412. buf := bufio.NewWriter(fileHandle)
  413. // 字节写入
  414. // 字符串写入
  415. buf.WriteString(string(buffer))
  416. localFileBuffer = append(localFileBuffer, buffer[0:maxLen]...)
  417. // 将缓冲中的数据写入
  418. err = buf.Flush()
  419. if err != nil {
  420. br.Msg = "上传失败"
  421. br.ErrMsg = "写入文件内容失败,Err:" + err.Error()
  422. return
  423. }
  424. }
  425. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  426. utils.FileLog.Info("end save")
  427. defer func() {
  428. if utils.FileIsExist(fpath) {
  429. os.Remove(fpath)
  430. }
  431. }()
  432. var playSeconds float64
  433. if ext == ".m4a" { //m4a格式的走这个计算逻辑
  434. utils.FileLog.Info("start calculate m4a duration ")
  435. tmpPlaySeconds, err := services.GetMP4Duration(f)
  436. if err != nil {
  437. br.Msg = "音频资源时长计算失败"
  438. br.ErrMsg = "音频资源时长计算失败,Err:" + err.Error()
  439. return
  440. }
  441. playSeconds = float64(tmpPlaySeconds)
  442. utils.FileLog.Info("end calculate m4a duration ")
  443. } else {
  444. utils.FileLog.Info("start calculate mp3duration ")
  445. playSeconds, err = mp3duration.Calculate(fpath)
  446. if playSeconds <= 0 {
  447. playSeconds, err = utils.GetVideoPlaySeconds(fpath)
  448. if err != nil {
  449. br.Msg = "音频资源时长计算失败"
  450. br.ErrMsg = "音频资源时长计算失败,Err:" + err.Error()
  451. return
  452. }
  453. }
  454. utils.FileLog.Info("end calculate mp3duration ")
  455. }
  456. utils.FileLog.Info("start update oss ")
  457. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  458. defer func() {
  459. _ = os.Remove(fpath)
  460. }()
  461. //savePath := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
  462. //savePath += fileName
  463. //上传到阿里云 和 minio
  464. resourceUrl := ``
  465. //if utils.ObjectStorageClient == "minio" {
  466. // err = services.UploadVideoToMinIo(fileName, fpath, savePath)
  467. // if err != nil {
  468. // br.Msg = "文件上传失败"
  469. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  470. // return
  471. // }
  472. // resourceUrl = utils.MinIoImghost + savePath
  473. //} else {
  474. // err = services.UploadVideoAliyun(fileName, fpath, savePath)
  475. // if err != nil {
  476. // br.Msg = "文件上传失败"
  477. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  478. // return
  479. // }
  480. // resourceUrl = utils.Imghost + savePath
  481. //}
  482. ossClient := services.NewOssClient()
  483. if ossClient == nil {
  484. br.Msg = "上传失败"
  485. br.ErrMsg = "初始化OSS服务失败"
  486. return
  487. }
  488. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  489. if err != nil {
  490. br.Msg = "文件上传失败"
  491. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  492. return
  493. }
  494. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  495. utils.FileLog.Info("end update oss ")
  496. item := new(models.Resource)
  497. item.ResourceUrl = resourceUrl
  498. item.ResourceType = 3
  499. item.CreateTime = time.Now()
  500. newId, err := models.AddResource(item)
  501. if err != nil {
  502. br.Msg = "音频资源上传失败"
  503. br.ErrMsg = "音频资源上传失败,Err:" + err.Error()
  504. return
  505. }
  506. resp := models.ResourceResp{
  507. Id: newId,
  508. ResourceUrl: resourceUrl,
  509. ResourceName: uploadFileName,
  510. PlaySeconds: uint32(playSeconds),
  511. }
  512. br.Msg = "上传成功"
  513. br.Ret = 200
  514. br.Success = true
  515. br.Data = resp
  516. utils.FileLog.Info("end VoiceUpload ")
  517. utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
  518. return
  519. }
  520. /*
  521. func (c *Controller) SaveToFile(fromfile, tofile string) error {
  522. file, _, err := c.Ctx.Request.FormFile(fromfile)
  523. if err != nil {
  524. return err
  525. }
  526. defer file.Close()
  527. f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
  528. if err != nil {
  529. return err
  530. }
  531. defer f.Close()
  532. io.Copy(f, file)
  533. return nil
  534. }
  535. */
  536. func init123() {
  537. fmt.Println("start")
  538. fmt.Println(time.Now())
  539. tofile := "./20201123.mp4"
  540. fromFile := "./第五期下.mp4"
  541. f, err := os.Open(fromFile)
  542. defer f.Close() //注意要关闭文件
  543. fileHandle, err := os.OpenFile(tofile, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0666)
  544. if err != nil {
  545. fmt.Println("open file error :", err)
  546. return
  547. }
  548. defer fileHandle.Close()
  549. if err != nil {
  550. panic(err)
  551. } else {
  552. //循环读取
  553. for {
  554. buffer := make([]byte, 4096)
  555. _, err := f.Read(buffer)
  556. //如果错误信息是其他类型的,则直接panic
  557. if err != nil && err != io.EOF {
  558. panic(err)
  559. }
  560. //注意,错误信息是以io包的EOF时,表示读取到文件末尾
  561. if err == io.EOF {
  562. fmt.Println("读取完毕")
  563. break
  564. }
  565. // NewWriter 默认缓冲区大小是 4096
  566. // 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
  567. buf := bufio.NewWriter(fileHandle)
  568. // 字节写入
  569. // 字符串写入
  570. buf.WriteString(string(buffer))
  571. // 将缓冲中的数据写入
  572. err = buf.Flush()
  573. if err != nil {
  574. fmt.Println("flush error :" + err.Error())
  575. return
  576. }
  577. }
  578. }
  579. fmt.Println(time.Now())
  580. fmt.Println("end")
  581. }
  582. // @Title 上传图片
  583. // @Description 上传图片
  584. // @Param Image query string false "图片,base64字符串"
  585. // @Success 200 {object} models.ImageResponse
  586. // @router /upload_image_base64 [post]
  587. func (this *ResourceController) UploadImageBase64() {
  588. br := new(models.BaseResponse).Init()
  589. defer func() {
  590. this.Data["json"] = br
  591. this.ServeJSON()
  592. }()
  593. var err error
  594. ext := ".png"
  595. uploadDir := "./static"
  596. randStr := utils.GetRandStringNoSpecialChar(28)
  597. fileName := randStr + ext
  598. fpath := uploadDir + "/" + fileName
  599. image := this.Ctx.Request.FormValue("Image")
  600. if image == "" {
  601. // 从 file文件中获取
  602. f, h, e := this.GetFile("Image")
  603. if e != nil {
  604. br.Msg = "参数错误"
  605. br.ErrMsg = "获取资源信息失败,Err:" + e.Error()
  606. return
  607. }
  608. fileData, e := ioutil.ReadAll(f)
  609. if e != nil {
  610. br.Msg = "上传失败"
  611. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  612. return
  613. }
  614. pass := filetype.IsImage(fileData)
  615. if !pass {
  616. br.Msg = "文件格式有误"
  617. br.ErrMsg = "文件格式有误"
  618. return
  619. }
  620. ext = path.Ext(h.Filename)
  621. dateDir := time.Now().Format("20060102")
  622. uploadDir = utils.STATIC_DIR + "hongze/" + dateDir
  623. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  624. if err != nil {
  625. br.Msg = "存储目录创建失败"
  626. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  627. return
  628. }
  629. randStr = utils.GetRandStringNoSpecialChar(28)
  630. fileName = randStr + ext
  631. fpath = uploadDir + "/" + fileName
  632. defer f.Close() //关闭上传文件
  633. err = this.SaveToFile("Image", fpath)
  634. if err != nil {
  635. br.Msg = "文件上传失败"
  636. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  637. return
  638. }
  639. } else {
  640. b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, image)
  641. if !b {
  642. br.Msg = "图片格式不正确"
  643. br.ErrMsg = "图片格式不正确"
  644. return
  645. }
  646. re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
  647. base64Str := re.ReplaceAllString(image, "")
  648. base64Str = strings.Replace(base64Str, " ", "", -1)
  649. err = utils.SaveBase64ToFile(base64Str, fpath)
  650. if err != nil {
  651. br.Msg = "图片保存失败"
  652. br.ErrMsg = "图片保存失败,Err:" + err.Error()
  653. return
  654. }
  655. }
  656. fmt.Println("end")
  657. defer os.Remove(fpath)
  658. hzUploadDir := utils.RESOURCE_DIR + "images/"
  659. savePath := hzUploadDir + time.Now().Format("200601/20060102/")
  660. savePath += fileName
  661. //上传到阿里云 和 minio
  662. resourceUrl := ``
  663. //if utils.ObjectStorageClient == "minio" {
  664. // err = services.UploadFileToMinIo(fileName, fpath, savePath)
  665. // if err != nil {
  666. // br.Msg = "文件上传失败"
  667. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  668. // return
  669. // }
  670. // resourceUrl = utils.MinIoImghost + savePath
  671. //} else {
  672. // err = services.UploadFileToAliyun(fileName, fpath, savePath)
  673. // if err != nil {
  674. // br.Msg = "文件上传失败"
  675. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  676. // return
  677. // }
  678. // resourceUrl = utils.Imghost + savePath
  679. //}
  680. ossClient := services.NewOssClient()
  681. if ossClient == nil {
  682. br.Msg = "上传失败"
  683. br.ErrMsg = "初始化OSS服务失败"
  684. return
  685. }
  686. resourceUrl, err = ossClient.UploadFile(fileName, fpath, savePath)
  687. if err != nil {
  688. br.Msg = "文件上传失败"
  689. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  690. return
  691. }
  692. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  693. utils.FileLog.Info("end update oss ")
  694. item := new(models.Resource)
  695. item.ResourceUrl = resourceUrl
  696. item.ResourceType = 1
  697. item.CreateTime = time.Now()
  698. newId, err := models.AddResource(item)
  699. if err != nil {
  700. br.Msg = "资源上传失败"
  701. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  702. return
  703. }
  704. resp := new(models.ResourceResp)
  705. resp.Id = newId
  706. resp.ResourceUrl = resourceUrl
  707. br.Msg = "上传成功"
  708. br.Ret = 200
  709. br.Success = true
  710. br.Data = resp
  711. utils.FileLog.Info("end VideoUpload ")
  712. utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  713. }
  714. //
  715. //func init() {
  716. // fmt.Println("start")
  717. // var err error
  718. // //imageBody:=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq8AAAH0CAYAAAATwMQ0AAAgAElEQVR4XuydCbyc0/nHf9QSGiQhiBINaklRS6i1tihto7bYUolYIlVLbI3QEEErQojGFlFLQmqJJRptELuQIlGK0NJIpIJohKrE/v/85njzn5k7c /M3Jk7Z Z n88nnyf33vc973O 75l5f3PmOc9Z6uuvv/5aGAQgAAEIQAACEIAABGqAwFKI1xq4S4QIAQhAAAIQgAAEIJAigHhlIEAAAhCAAAQgAAEI1AwBxGvN3CoChQAEIAABCEAAAhBAvDIGIAABCEAAAhCAAARqhgDitWZuFYFCAAIQgAAEIAABCCBeGQMQgAAEIAABCEAAAjVDAPFaM7eKQCEAAQhAAAIQgAAEEK MAQhAoOYJTJ8 XXfffbcGDx6sNm3apPqzePFiXXDBBdp///219dZb13wf6QAEIAABCAQCiFdGAgQgUPMEShGvo0aNUufOnbXvvvum j9x4kQ9 yzGQK4nGASMT158mTtvffeJV0nO Zc8bkfa6 99hLBPmvWLI0cOVJDhw5Vu3btMk5JYtpmm21S52R/AChn/2kLAhCAQLkIIF7LRZJ2IACBoghYiN10001FnXPEEUfoxBNPVCnnJhdKb8Pi1TZnzpyUkLV43XTTTXXJJZfkjStdeFoonn/ UuOzRalFtX9 /df8vezzz57iVguquPfHNyUePX1fMzAgQPVtWvX1FmFileLeB9722236eSTT14yg53dh/S411xzzdT1unTpUkp3OAcCEIBASQQQryVh4yQIQKC5BJoSYtntWyhaZFq8ZltzZl6zxWt66kFjs7G 5ty5c5eI0YULF6ZEn2cw09tw kznMlMb/pMbHZ/LKA9W/rYY49liONczBNB7HiGDBnSQEymi9dC2kuu0ZTQ9v179913S5pBbu7Y4XwIQKB1E0C8tu77T 8hUDUC5RSvpXQiuX4 8ZpLcDZ1HYvdMWPGNBCQjYnX7JzcxmZK8zHLJ1wdbzEzr031L/m72/SHCKcikE9cKDWOgwAEykUA8VoukrQDAQgURSARYp5NbSp9wLOAicjMNfOaPSuba8bUv7MlM5/5xOsJJ5ygQYMG6aWXXmrQn2RGNDt3NDkwW0Q2lt7gmVXnvzYmXt94442MtIPsgPy1vWd7x40bp3PPPTf19b2Fstveb7/9dPPNN6eukdjpp5 e6lf673LdtEJmXX1erntR1CDgYAhAAAIlEEC8lgCNUyAAgeYTKNfMq2cBLdwS8ebIssVrIiLTRVlj4vXCCy9MicL0XM7GZjATGm7TAtbiMV3gJjOV/fr1WyKe81VDKOQ6 egnba6xxhpLhGV6e67E4AoMXqBlEZ9rRrip 9LYLG/zRwUtQAACEGiaAOK1aUYcAQEIVIBAUyIp 5K5cl6TPFPPAKZ/fZ2I12QW1W1lC8pCxGv79u1TeaQWskkbuVbt 2 5BGrSh2RhV7p4LkS8JmIz30xpsvjM18klXJO4kmoDTbWXxJtv5jXfNSowPGgSAhCAQF4CiFcGBwQgUBUC6eK1sRXto0ePTgnTbPGaCFd/DZ4cky0W/XO6wEvvaDnFaxKL48z Kj09zu23317du3fPmPVsLG0gEZu5atWm80iE81577dXg uWcec2X01uVAcRFIQCBVksA8dpqbz0dh0B1CWSL16Y2GUgXa4kgdGkqi9d0cZcIOfeusTJOhYhXt5GkJOSbeW1MOPocC/OxY8emYE dOjXlLaidQpBrE4VcYrMx8dq7d /UzHD67HN6JYRc7ZWS89qYQK/uSOLqEIBAayOAeG1td5z QiASAs0Rr8m5nmlMBGCHDh1SAu6dd95J9bCxjQDSv7J3uav0Oq9ONUhyXtMF6wcffNCg2H9Tgi65jmOxYHSu6S677JISm8ccc0yTC7aa po/16xykgNscbzTTjtlVBtoTs4rs66RvHAIAwIQYIctxgAEIFAdAs0Rr0nEiTjcddddUyvrk6/t89Vn9TVtFnbOAz3kkEP04osv5hWvCxYsWLLr1Lx58zLEa3Jtt5dd1zWJL4nDq/y98UGyUMp/LyTn1Yu PIv61FNPLUkHaKyEV64SVsnM65lnnqkrrriiyUoDSezp4r xGrbVGT1cFQIQaM0EmHltzXefvkOgigSam/PamABsSrz6q3aLSYtKF 7PN/M6adIk3X///an0g/RZWIvKZBFWdr5tOtLrr79eu 22mzp16pSxyr8Y8ZotcnNtyOD28tVezVW9IIkrvZpCvsVvbjvJSW6qhFYVhxOXhgAEWhEBxGsrutl0FQIxEWhq5jU71lzVBvLNXuYSeOnizG0nObYWp niNZlFTbZaPfzww1N1X7O/os9XwzXXlqml7rCVlNtKhGmSEpHOJqmBm2tzhETUJtUG3J5jcQrElVdeqfSSWo2J10KEekxji1ggAIH6JoB4re/7S 8gEC2BYktlJbOf6av584nX9BX 6QCSr8It9Dp37pxa9Z IYv/87LPPplIA/PdkxjUp/O/cWufHZpfcKgRwqTtspW/nmksU 9qNbWGbS7ymx5u9RW1TmzAU0leOgQAEIFBpAojXShOmfQhAICeBpsRrtrDKJ95KwTtlyhStv/76GZsQuJ2m8libEoqlxMI5EIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQABCEAAAhCAAASKI4B4LY4XR0MAAhCAAAQgAAEIVJEA4rWK8Lk0BCAAAQhAAAIQgEBxBBCvxfHiaAhAAAIQgAAEIACBKhJAvFYRPpeGAAQgAAEIQAACECiOAOK1OF4cDQEIQAACEIAABCBQRQKI1yrC59IQgAAEIAABCEAAAsURQLwWx4ujIQABCEAAAhCAAASqSADxWkX4XBoCEIAABCAAAQhAoDgCiNfieHE0BCAAAQhAAAIQgEAVCSBeqwifS0MAAhCAAAQgAAEIFEcA8VocL46GAAQgAAEIQAACEKgiAcRrFeFzaQhAAAIQgAAEIACB4gggXovjxdEQgAAEIAABCEAAAlUkgHitInwuDQEIQAACEIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQABCEAAAhCAAASKI4B4LY4XR0MAAhCAAAQgAAEIVJEA4rWK8Lk0BCAAAQhAAAIQgEBxBBCvxfHiaAhAAAIQgAAEIACBKhJAvFYRPpeGAAQgAAEIQAACECiOAOK1OF4cDQEIQAACEIAABCBQRQKI1yrC59IQgAAEIAABCEAAAsURQLwWx4ujIQABCEAAAhCAAASqSADxWkX4XBoCEIAABCAAAQhAoDgCiNfieHE0BCAAAQhAAAIQgEAVCSBeqwifS0MAAhCAAAQgAAEIFEcA8VocL46GAAQgAAEIQAACEKgiAcRrFeFzaQhAAAIQgAAEIACB4gggXovjxdEQgAAEIAABCEAAAlUkgHitInwuDQEIQAACEIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQCBQGDx4sW64IILNHny5IKQ7L333ho8eLDatGmz5PiFCxdqyJAhOvnkk9WlS5fU72fNmqWRI0dq6NChateu3ZJjk vtv// 2nrrrZcc94Mf/EBXXXVVzhhyXbOgYCM/aPr06Xrqqad04okn5ow0 8TJ05MHbfvvvtmHG/ l1xyiU444QTdeOONOuSQQ5bch8gREB4EIFBjBBCvNXbDCBcC9UggW0w21keLqbvvvjslXseMGaObbrqpKCRHHHGE vXrlxLLu 66qx599FFZxI4dOzZD5I4aNUo77LBDStymW7bQ3nTTTVMCOV0cFxVQCx9cyAeF0aNHp/pt1uaQ3r9EvG6 eYpwfvOO 802oOkLbeT617V64eCFr6tXA4CrYoA4rVV3W46C4E4CZQqXps785pPvCaziKeffnoDUTplyhStv/76S2YVLcos8mpJwKaPgnwzrxap/pCQ3a mZl5zMcs16pJ7vs022zSYxY1zlBIVBCAQCwHEayx3gjgg0IoJJELGYvLmm2/WSy 9lJOGZzkPP/zw1GxpdtpAMfjSr5c 83rKKafo3HPPzXn9ZAYx zpOTfA5/pekKxQTSzWOtQA9//zzc17aM6Hm7HuQML7 utTM7GXXXbZEjbJcU4VyGdnn312XmGaPoOe/iGkGjy4JgQgUFsEEK 1db IFgJ1SaAcM6/Z a3ZM4TpM4yNidfrrrtO6bOHTcXmdp1r6xnYWhGvxQwic5wzZ86SnNh0run/z56tzjdD62vnyk8uJiaOhQAEWjcBxGvrvv/0HgJFExg6tOhTMk4YMqTh ekC8fvf/37OxVtJbukbb7yxJOc1mbHz f56O32RULbIcn6sF265fZuP33PPPVNtJTmvnnlNxKuv44VMSX5ssrgrPfok7jXWWCPvgqfm0arM2Rb6 fJV02dLzfDZZ5/NmOXO5ppvBteR55t5tdC35VskVple0yoEIFAvBBCv9XIn6QcEWojAUks170Jff920eM0WoumzqtniNRGQbjU9lcAia9GiRamvuefOnZuRu5mI3eaI1xYRrh98IP3 96UD79DBCrHB fmqMFhUdu7cOfVVf7pwffnll1MMk9 7wez/Fzrzmu/apXeSMyEAgdZGAPHa2u44/YVAMwnEJF7dFVcN PDDD7XKKqs0EK eFcw1 1eIeH3sscdSX5fnmnm1UHNJLs/GZpeMaibezNMXLGi eD3ppKLF69prr71kdtusnNeapFI0Z aVRVplHR00BoFWSwDx2mpvPR2HQGkEYkobcCqAy1nZkvJZ999//5LFSNnCNcnf7N27d0qQHXPMMak0gVxpA PGjUvNQu61114pgZykDbTIjGtpt6bgswpNG8iV79ucnNd6zw8u AZwIAQg0CwCiNdm4eNkCECgHASyc16z0wbSr5FrlXryu7Zt2 rVV19NpQh45tSWPjOaXqP0tttuU9 fXXFFVc0qPOaiDufn70QK18JqXJwaMk20uvYJjPJzkFN6trmmyVNGDrWxvJdk764rm6S2 prvvvuu82qFNGSjLgWBCAQJwHEa5z3hagg0KoINLWiv1Dxmp3zmr5KPhGinql1/qZtl112Sc3Apm9S4Jza/v37y6WxOnTokBJeW2yxRUpw2XLtBLbmmmvWXLWBJHVi5syZck5rYu6LF7ZZaOZKi8iuIpBd9zbhnOTOJu22WKpFq3rl0FkItE4CiNfWed/pNQSiItCUeM3 mjs7HSDXbGyur8aTigXehtZ1StN3xUrElcHkKsyfveo KoBFBpO 21U2y6buRbp49bEWvk7ZMFvX6E123MpXF7fIUDkcAhCAQAMCiFcGBQQgAAEIQAACEIBAzRBAvNbMrSJQCEAAAhCAAAQgAAHEK2MAAhCAAAQgAAEIQKBmCCBea ZWESgEIAABCEAAAhCAAOKVMQABCEAAAhCAAAQgUDMEEK81c6sIFAIQgAAEIAABCEAA8coYgAAEIAABCEAAAhCoGQKI15q5VQQKAQhAAAIQgAAEIIB4ZQxAAAIQgAAEIAABCNQMAcRrzdwqAoUABCAAAQhAAAIQQLwyBiAAAQhAAAIQgAAEaoYA4rVmbhWBQgACEIAABCAAAQggXhkDEIAABCAAAQhAAAI1QwDxWjO3ikAhAAEIQAACEIAABJolXseMGaPnnnsuRbFbt27q16/fEqKzZs3S5ZdfrkWLFmmFFVbQd7/7Xc2cOXPJ39dff32deOKJqb/ZJkyYoAcffDD1//bt22vYsGFLjl2wYIGGDh2qxYsXp37Xp08f7bjjjkv PnXqVI0dOzb1c5s2bTRkyBB16NCBuwsBCEAAAhCAAAQgUGcEShavkyZN0lprraWtttpKCxcu1EUXXaSDDjpoyc933HGHDj/88JQ49bGPPPJI6u/bbbddA4QWn PHj9fAgQO10korpYRq586dddppp6WOHTRokDp27Jj62SL3oYceSv1u3XXX1ezZszV8 HD16tUrJWj9e1u6 K2ze0Z3IAABCEAAAhCAQKslULJ4zSbmWdhOnTqpR48eDWAms7AHHnigdt555wZ/Txen/qMF6hNPPJGaQfVsbSJsLVaTWVi307NnT40YMULz589fIlbThbCPxyAAAQhAAAIQgAAE6odAWcRr9sxrNp5k5vXjjz9O/WmfffZZInKzxaj/bgE6btw49e7dW/PmzVsiZJNUgPTZ1Wzh65lYz7ruscceKXGLQQACEIAABCAAAQjUD4GyiFfPutrSc14TRJ51HT16tPr3768uXbosSTHwV/yepc0lNtPF67Rp0zRnzpyMPNZEvDrNIDvFAPFaP4OTnkAAAhCAAAQgAIFsAs0Sr16MNWrUKHXt2jVnusCMGTPk3NczzjhD7dq1W3Jt/37KlCmpBVtuwwI0SQNg5pVBCgEIQAACEIAABCCQj0CzxGtTea6uADBgwIAM4epAskUtOa8MUAhAAAIQgAAEIACBQgiULF6dx/rKK69klLtKLthYDmwyW tyWEmaAdUGCrlVHAMBCEAAAhCAAAQgULJ4Ta/xmmBMFmKl13hN/rbccsvps88 S/3oGq9vv/12albWebA26rwyGCEAAQhAAAIQgAAEmiJQsnhtquHG/u7ZV4tfi91EvDanPc6FAAQgAAEIQAACEGgdBKoiXp3zOn369JzVCWLBPn3m wWFsvUmqxV0HAdBAAIQgAAEIAABCDSfQFXEa/PDrmwLFq6I0soypnUIQAACEIAABCBQCgHEaw5qiNdShhLnQAACEIAABFoZga /lq68Unr3XWnffaVu3VoZgOp0F/GKeK3OyOOqEIAABCAAgVoncMAB0k47SZ06SddfL11 udS1a633Kvr4Ea I1 gHKQFCAAIQgAAEoiNw8MHSySdLO wQQnv4YenOO8NMLFZRAohXxGtFBxiNQwACEIAABOqOwJQp0iWXSJMnZ3ZtqaWkr76S7LGKEUC8Il4rNrhoGAIQgAAEIFCXBDzr2rOnZJ9uRx8tHXaY1L17XXY7lk4hXhGvsYxF4oAABCAAAQjUBoFtt5WeeaZhrOecIy2zjGSPVYwA4hXxWrHBRcMQgAAEIACBuiPw4IMhr/Weexp27YEHpLvvlq6 uu66HVOHEK I15jGI7FAAAIQgAAE4iYwcKC02mqSfba99VZYwGWPVYwA4hXxWrHBRcMQgAAEIACBuiPgfNbzz5e23z5311ZeWZo7V7LHKkIA8Yp4rcjAolEIQAACEIBAXRJYemnpiy8k 1x25JHSccdJzovFKkIA8Yp4rcjAolEIQAACEIBA3RF4/nnpqKMk 3zWt6 0666SPVYRAohXxGtFBhaNQgACEIAABOqOwPjx0ksvSb/7Xf6uDRsmLVwo2WMVIYB4RbxWZGDRKAQgAAEIQKDuCAwYIK23nmSfz 67T3JFgpEj6677sXQI8Yp4jWUsEgcEIAABCEAgbgK77y4NHizZ57MXX5QOP1yyxypCAPGKeK3IwKJRCEAAAhCAQN0R2GYb6c9/ljp2zN 1Tz4JpbTssYoQQLwiXisysGgUAhCAAAQgUFcEFiyQNthAsm/KNt5YevRRac01mzqSv5dAAPGKeC1h2HAKBCAAAQhAoJURePJJadAgyb4p23FHafhwyR4rOwHEK K17IOKBiEAAQhAAAJ1R CWW6TXXpPOO6/prjnnde 9Q 4rVnYCiFfEa9kHFQ1CAAIQgAAE6o7Ar38trb66ZN UnX22tNxykj1WdgKIV8Rr2QcVDUIAAhCAAATqjsC 4YNCuybsltvDdUGGqsH21Qb/D0vAcQr4pWXBwQgAAEIQAACTRHYZBPprrsk 6bMi7XOPTcs2sLKTgDxingt 6CiQQhAAAIQgEDdEdh2W2naNGnppZvu2uzZ0o9 JNljZSeAeEW8ln1Q0SAEIAABCECgrgi89Za0ww6SfaHmWq/z50tLLVXoGRxXIAHEK K1wKHCYRCAAAQgAIFWSuCxx6RzzpHsC7X115ceeECyx8pKAPGKeC3rgKIxCEAAAhCAQN0RuOEG6fHHJftCbc89pYEDJXusrAQQr4jXsg4oGoMABCAAAQjUHYERI6Rll5VOOqnwrvXvL221lWSPlZUA4hXxWtYBRWMQgAAEIACBuiPgElk77RRKZRVqV18tffhh2JULKysBxCvitawDisYgAAEIQAACdUfgJz8Js672hdrEidL110v2WFkJIF4Rr2UdUDQGAQhAAAIQqDsCBx8cFmxtumnhXZs5UzrgAMkeKysBxCvitawDisYgAAEIQAACdUdgnXWkp56S7Au1r76Sdt djQoK5VXEcYhXxGsRw4VDIQABCEAAAq2QwLe/Lb33nmRfjG24oTRpkmSPlY0A4hXxWrbBREMQgAAEIACBuiPw2WdS27aSfbG2335S376SPVY2AohXxGvZBhMNQQACEIAABOqOgGdct9mmtK1eXWKrTRvp OPrDks1O4R4RbxWc/xxbQhAAAIQgEDcBP7xD6lHD8m WLvzTmn8eMkeKxsBxCvitWyDiYYgAAEIQAACdUdg nTp2GMl 2LtzTelXXeV7LGyEUC8Il7LNphoCAIQgAAEIFB3BB59VDr33NKrBnixlreWXXPNukNTrQ4hXhGv1Rp7XBcCEIAABCAQP4E//Um69lrJvhT7xS kn/5UssfKQgDxingty0CiEQhAAAIQgEBdEnDOqstd2Zdid90VhO8NN5RyNufkIIB4RbzywoAABCAAAQhAIB Bm2 W/vlPaejQ0hntuad03XXSuuuW3gZnLiGAeEW88nKAAAQgAAEIQCAfgUsvlebOlexLtU8 kXbaKWxy0Lt3aGW11aQVV5R 8AOpU6dSW26V5yFeEa tcuDTaQhAAAIQgEBBBC64QFq8WLJvrj3xhPTYY9KcOdIyy0j/ lf4t9Za0qBB0t57N/cKreJ8xCvitVUMdDoJAQhAAAIQKInAmWdKK68s2VfKXNFg7FhpwIAwE4s1SgDxinjlJQIBCEAAAhCAQD4CFpTrrReEZaVtu 1Cbu1ee1X6SjXdPuIV8VrTA5jgIQABCEAAAhUl0K ftO22kn1L2I9 FFILllqqJa5Wk9dAvCJea3LgEjQEIAABCECgRQi0dJ3Wyy8PebD2WE4CiFfEKy8NCEAAAhCAAATyETj6aGm//aR99mk5Rt/7Xph99UIurAEBxCvilZcFBCAAAQhAAAL5CDj/9NRTWzYP1bVln3lG v3vuS85CCBeEa 8MCAAAQhAAAIQyEfAOaguk2Xfkrb tIDD0j2WAYBxCvilZcEBCAAAQhAAAL5CGyzjXTVVZJ9S9rEidLjj0sjRrTkVWviWohXxGtNDFSChAAEIAABCFSFwPe/L91 u2Tf0vaTn0gnnSTZY0sINEu8jhkzRs8991yqsW7duqlfWhmJGTNmaPTo0VphhRU0YMAAdenSpVHsyfG52lq0aJFGjRqlN954I2d7U6dO1VgX95XUpk0bDRkyRB06dCj5Nk f b623mS1ks/nRAhAAAIQgAAE6oSAa7xOmRJqvba0ff21tO66kmdht9yypa9enuv985/Syy HLXatzbzwbaWVmtV2yeJ10qRJWmuttbTVVltp4cKFuuiii3TQQQelfk7Mv7/88svVp0 fRsXrrFmzUuLTInf55ZdPCdWuXbuqR48eqaYskjt16pT62SL3jjvu0BlnnKF27dpp9uzZGj58uHr16qUdd9xRg7y9mqRhw4aVDAbxWjI6ToQABCAAAQjUF4FOnaQZMyT7aplnXi38FiyQtthCmj9f s53pP/8R1pzTc/cSd/9rrTnntIqq1Qryszr3nZbWHDWrp207LLSxhuHbXEtZPv2lU45peQ4Sxav2VdMF5jFitfscy1Qp0yZohNPPFHvvPPOEmFrsZrMwnbv3j0llEeMGKH58 cvEauehR0/frwGDhyodf1ppQRDvJYAjVMgAAEIQAAC9Uhgww0lf8vsLWKrac8 K73/vvTf/0offSQtv7z04YfS0kuHurDf pZ0zTXSvvtKv/61tNlm1Yn2hhvCAjcL6d69pR13bBiHRa1nkx96qKQYyyJemzPzmi1G3QvPxDrloH///vrggw WCFmnINgsdm1OU/BMa8eOHXXaaaelfueZWM 67rHHHurZs2dJUBCvJWHjJAhAAAIQgED9EbBITMRiLfTOQvvII6VevaQzz2yZiN97T/rjH4NotXj2dZuqkvDUU5K/YffscZG7iZVFvKaLyXRKhaQN5BK 6eL15Zdf1iuvvJKahc0WrwceeKCGDh2qzp07I15bZnhyFQhAAAIQgEDrImBh5dzTWrNrr5XuukuaPLlykd97r3T//dIdd0gDBkjHHit17Fj49ZwG4Tq6nlUuwpolXpNZ0/T81GLFKzOv3xDzC2PRIumzz6SvvgpfAzhPBKsdAq Ks2cKb3zTkhMX2aZkIu09dZhX2wMAuUk8NJL0hNPSG 8IS23nLTJJmEWo337cl6FtiDQugl8 mlIF7CvRbNwHTVKuvHG4kRlU3294gppwoTA5oQTpB//uKkz8v/9yy/D UWkEDRLvObKcy1WvPr4msh5XbgwCBInSX/wQbhhzidZY43ib5hXLXrnDP/z1xH 2Tk1L7wQHkCzZgXB4wTxn/0s/N95I01VUJg2LbTph5qFk//94AfS/vs3fW4hvXj bBd3d/ FoS2PzE5MXzttaXNNw9fETghe7XVQu5NYh6Y5vbuu HrAX/9snhxOHeDDSRvg1eL9tpr4d6Zt1/ELmDtDx7bby99/nlIpv/rX6W33pLeflu6 GJpjz2a7qnPSVZmenxstFE4r5mrM5u MEeURMDvB9/ dhCQLWUnnugcqTDG9t47jBe/Jv1AOeyw8CDwdpbNseRDmL8O/OILyWlb/kDtD2S rj9gYxCoJIEHHwzPHD/b/P7nZ4 fM35G tn25puSF4k777Nr1/A89g9Sm/4AACAASURBVM/bbVe qPy88jPOvlbt3/8Oi7y8gGr33ZvXCz/rhgyRdttN s1vyreIzc9Jz9x6prgAK1m8utpA9tf52dcrJG3A50RZbeCpiSEB2i8OT4n7zdsPCQvCTz6RLMj8grKwPOAA6ZhjGsdt4fbb30r33BOEqs/xnsUWe55iX3XVhudb6PkBddNNkoWSr3n44eHhYcHn2Cwg7747eD9EDz5Yats2iEKLKovGK6 U vQJdeI8PV o foWrPfdJ02fHpLE3Y5ndryq0QLNbxoW9Y7TYttfr3g2yH3zi92fVi26/WC3WHV//TuvjPzf/yTPVvr3Fn7O0Wkqwdwzm34D83nur7m4fef4 A3GD3G/gfnB67bM4Ic/DB8MfK98HzbdNDDym59/55 LsdGjQ1K874HvnZlasDb2VYnZ D447ksucW25sPoysalTpb/8Rbr vCmYNHq N0P99F/9/1zDpPHYSnmD2Dm4X9 8zc/f8jwfUju1 qrh/vqB4X/ZrHisW/vDxwWaRbo9v67j/P98/g1d78 8plfN74/Hku D 6X23VcHq8 36Vg/BDK962DjzVDv9G5/Irb9Myjx51Z R74Z7fn9j0mPD7N099uuJ/un6/hMekHoWs3FjMz7tehP4j4deex6Db9cPAHOL/efN/MxP1xPH69Wuj5d762Y3Ebfg14HPr15MWlhXw4efpp6Xe/C LUAjaXPfxwWOFrNm7z5z8PD5iEse9dLjNbjzPfHz/kzMYfulyY3f3zvTV3t/noo2Ec j3C/XabnTtLLono97d11sm9uMXXePHF8Hr0ffLr2e9dbtv3yq/HXXdtWnxYqFvUvPJKiNGvJcfla/v1k v9NL3P8 aFup3uq7 u9D30B/8ddpCch2fx4w RHo9//3v4ve VX4NHHFH8q8 vHff5H/8I49bjwO/ffr35tegP/GbgD6qOP61qT0EX89j3P78fm43vva/p14W/zbP5/34te9z7PdjX82vZv/Nrw2PU79lm6fts83333z/ OMTo dyUX4W Bng88za7XhCx4uJ3L776Xb8vmduvs9 zbnPyXufGXvMeMLG5/o4r0T369W5kx4f5nTUUeF15PGb3g9f2/G6vx4DjtHvaebsD3Clvk9mA/eHNz8j7GvdjjtOOvBAqXv30npy9NFhjPn55/FQbnv99f /z020XbJ4Ta/xmlxjn332WVLeyr/LJ15dTSApjZXUf42uzutdo/9/VtAv1nwPU7/xWJQ aT0i1 EWc5EDPlN2S/aSy8NA/ gg6T /cPDqxRLPoX6zdYvdL9Q/UZgEeYZ2sbSDCxA/UDz7InFih8QfiPyQyeZSbZYtxD0m7fb8oN5l12knXeWDjkkvMEXan4j8QPaffVDujHzG9B114WcGZsfYH4I Q3Lb8h c/ID2cLAb8QWGr4nftOzILA4WHHFwMSCyv/8xuY3a8fg//vN2uf6PiSi19f1p0jPIvlh6/vnB0cu84vKnwjPOEO68MIgWEupuWdx8Ic/SOPGST/9aRCSHid Y/dD0V/75uNssWThbB5 40hEuPvnB5EfVn7Q P/uo z74MfGP6dHyRe9Wl2FgoWTeZnNn7Q Bybvbn5AeXxYu5 QPlBZu Hi3n73vjh63YtWjzG/KneDyCPSbP2hxWPV/P1h0CPI48Jf6Cw971zO47BH0DchzvvDOPTry3fa4sHj0uzs5Byn3yffH/9sPfD0uPV7SWi2r9L0m SMeAHof9v3mZjEeEY/SHUMfo15IUGFijmk23m4sUIvgdnnRVmwz2bkbyezd6M/CD1hzl7s/M1LdbdB7MzQ//se K 2d/XbbTTqFPFqYe/76/vj9m7a/ LPomTfr/MdvUa9Hx nXjDwx f/Lrwrv1 IOWP5T6dW3x5j64fd8zC26/h/mYpgqyu6/uj/vge X7bu Hm lRbzHnoVz8q2LuVqoe1x4DPg1bi5m57bcht8HLJ7MwffX5/i u9u268DjwGPOQtnj0G34deo77E/APrDsD9cWnS6T369 MOM77ffayyW3LaFvV9vFmK T0luY/p7h3/vseRvWfx 7ntgcZ Iqcbuwy23SN6jPhGT5upY/RpMPhw6Zr9HmpX77deR43Uf/I1bdtUcj1 P2UceCX3268rvYWbk8WLejtmvab/GPdZtyfuix5vHhsdtIl7dXzPxzz7f7ym N34d X3VY9X/dz8scn0/k/HuY/0sSa7l XjLUyTD3E 1 8l/rDjeDyW/dpwHxyHx6XHg1 Tfg/xM8Af1Jv6EJKP/fHHh/Y82dJc8z3xOEoEfXPbq/b51iHm4lqrxZi/yXE q59bEVjJ4rU5sTvP1eLXYrepzQuac51Szy2p2oCFUDIb44eFX3wWg77hfij6004M5hegZ678cPUbTvIG5jcZv9kls8DJV4MtHbM/NXvm1p/ckzd1PyT8oLFwqUT9Oj8Q/cD0g9wJ7v6k72v7wejZGL/pexbGFS38ybVc5g8Hni3yQ7iYr2D9gLfY8ht9skrTD65kNsX/d3v2fgj6Xvrh7IdJpc0PRT/YzNQPOj/Y/FB0HI6hUPM49UM6mQlyG35AV L JzFZ6PmbEX9IsXC0aPQ1LeL9sHVf/M3HN5VNCu1KwceZnWdW/fq0UEqu6w9JHid L/HMR3MtmZnzeLFYsVngpX8T0Nxr PyknI v5/cZCxEzLcQ8fvxNhF8jFq3JzLUFtd8H/P7amPk87wnvmVmLVr vua e7bM4shgp1fw 4TriFuDnn9 wFffXH0692toiyoK12N2R/P7njXfcD48Ff7DxhwWLbwtD98Gzs55B83tjoVxL7XNLnGfBnZ5u1pxremz7w4vfK5tr/oDgWVz7ejHv2OUJGGuTQszj1x/CSv0wUcg1ijymKuLVs6zTp0/P2JGryLgrenhJ4jU9Ij/k/CZTSj5sRXtG400S8BuovxK1eEq KvPXpy29p3WTgXJARQn4A6hFj79e9ocAf5Ap9qvcigZI41UnYOHqD7UeH57B9Qcczyr6m5VzzgmzVOV42PvbCAsnCzvPMpejzarDa4EAfvWr8GGlubOv/nbs0EPDt2T1ZE5dvOyyhjP72X10CoY3f/I3MxFZVcRrRP3PGYrFa6HGNrKFkuI4CEAAAnVGwKkh/qbIwsZfr3s21qknWPUJeBLCaRvf1IUvOSDPfo8YEWbT68k8OePUAadu5DN/y QPAE41iMwQrzluSLNnXiO7yYQDAQhAAAIQaHUEnK7kb0 akxLjNSCnnx7WgtSbOSXHM9NOmco2zzY779jfKkRoiFfEa4TDkpAgAAEIQAACzSTgxUWuQdqcRUaemTzvvMZnKJsZZlVP94JLLwz0YlrnTzu32vnWXlwe8bcIiFfEa1VfN1wcAhCAAAQgUBECzun04r9zzy29eVdzcMUg 3o1LzI0Ky8y96JYz8ZGluOajR7xinit15cj/YIABCAAgdZMwLWAvXjOvlTz9qcur2aPRUMA8Yp4jWYwEggEIAABCECgbARcrs95r/almssoekOLpA55qe1wXlkJIF4Rr2UdUDQGAQhAAAIQiIaAa7SOHBkqQZRirm/qTTzssWgIIF4Rr9EMRgKBAAQgAAEIlJWAFyK5pql9KeYd27xDnT0WDQHEK I1msFIIBCAAAQgAIGyErjoorDbm7d2LsWuvjpsQGGPRUMA8Yp4jWYwEggEIAABCECgrAT 9Kew7bd9KeaUgzffDKkHWDQEEK I12gGI4FAAAIQgAAEykrgjTekH/9Ysi/FLrlE s9/pAsvLOVszqkQAcQr4rVCQ4tmIQABCEAAAhEQWG45yduh2hdr558vffaZZI9FQwDxiniNZjASCAQgAAEIQKDsBH72M2nYMGmzzYpvevBgqU0byR6LhgDiFfEazWAkEAhAAAIQgEDZCfTsKR16qGRfrA0cGGrF2mPREEC8Il6jGYwEAgEIQAACECg7gbPOktq2leyLtZNPlr77Xckei4YA4hXxGs1gJBAIQAACEIBA2Ql4g4HHHw9VB4q1446TNt9csseiIYB4RbxGMxgJBAIQgAAEIFB2AlOnhq/97Yu1o4 WdthBsseiIYB4RbxGMxgJBAIQgAAEIFB2Au G2ZP7Yu13r1DqS17LBoCiFfEazSDkUAgAAEIQAACFSHw7W9L770n2Rdjzd1etphrcWzBBBCviNeCBwsHQgACEIAABGqSwA9 II0dK9kXY/vtJ/XtK9lj0RBAvCJeoxmMBAIBCEAAAhCoCAHnrO6/v9SjR3HNH3OM5NnXPfcs7jyOrigBxCvitaIDjMYhAAEIQAACVSdw/PFS166SfTHWvbs0aJBkj0VDAPGKeI1mMBIIBCAAAQhAoCIELrxQ ugjyb4Y22UX6bzzJHssGgKIV8RrNIORQCAAAQhAAAIVIXD99dKTT0r2xdj220uXXirZY9EQQLwiXqMZjAQCAQhAAAIQqAiBe VrrtOsi/Gtt46bG5gj0VDAPGKeI1mMBIIBCAAAQhAoCIEnnpKOv10yb4Y22wzafx4yR6LhgDiFfEazWAkEAhAAAIQgEBFCLz unTssdLDDxfX/EYbhdlaeywaAohXxGs0g5FAIAABCEAAAhUhMH9 qDZgX4x16RIErz0WDQHEK I1msFIIBCAAAQgAIGKEPjsM6ltW8m GPvOd6RnnpHssWgIIF4Rr9EMRgKBAAQgAAEIVIxAmzbSwoWSfaHWsaP0yiuSPRYNAcQr4jWawUggEIAABCAAgYoRWGMN6cUXJftCrV076c03JXssGgKIV8RrNIORQCAAAQhAAAIVI9CzpzRsmLTBBoVfYostpKefllZYofBzOLLiBBCviNeKDzIuAAEIQAACEKg6gVJqti67rPTJJ5I9Fg0BxCviNZrBSCAQgAAEIACBihEoZavXpZaSvv66YiHRcGkEEK I19JGDmdBAAIQgAAEaonAz34m/epXkn0h9vnn0oorSvZYVAQQr4jXqAYkwUAAAhCAQOsj8PLL0ve/X F H3KIdMABkn0h5nSB1VYLaQNYVAQQr4jXqAYkwUAAAhCAQOshcMMN0qWXSi 9FHTlnXdWsO9HHy3tsINkX4h9 KHUubNkj0VFAPGKeI1qQBIMBCAAAQjUN4H//Ee68krpqqukd9/9/76uskoow1oxO ecsNlA//6FXeL996WNN5bssagIIF4Rr1ENSIKBAAQgAIH6JPDqq9LFF0vXX9 wf65E5RnYX/6ygn0/80xp5ZUl 0Ls7belbt0keywqAohXxGtUA5JgIAABCECgvgg88IB02WXS/fc3XLi/9trSCScE0eqZ14rab38b8lftC7HZs6Uf/Uiyx6IigHhFvEY1IAkGAhCAAARqn8Bnn0k33yyNHCn9/e8N MJzVNOkQ4 WFpmmRbqrxX0nDlBSRdir78u7b23ZI9FRQDxiniNakASDAQgAAEI1C6BfPms7tHSS0v77htE6847V6GP114rPfecZF IzZwZVpHZY1ERQLwiXqMakAQDAQhAAAK1R C116QRI6Rx46TFizPjb9tWOuoo6dRTpXXXrWLfbrlF vOfJftCzCUQzj1XmjChkKM5pgUJIF4Rry043LgUBCAAAQjUE4EpU8JCq8mTG azusrUiSdKxx4b1klV3e67LyTe/v73hYXiWVon49pjURFAvCJeoxqQBAMBCEAAAnET8IZT48cH0friiw1j/eEPQ2pAz57St74VUV8sXB20fSH29NNhutgei4oA4hXxGtWAJBgIQAACEIiTwAcfhNqsrtE6b15mjM5n3W /oPV23DHO PX449LgwUr5QuyxxyTXhrXHoiKAeEW8RjUgCQYCEIAABOIi4MX2zmcdO7bhTqnOZz3ySOm006qcz1oIsmLTAJwTMWyYZI9FRQDxiniNakASDAQgAAEIxEHg0UfDt yTJjXMZ/VGVc5nbZH6rOXC8fLLoTaXfSH2l7 E/Fh7LCoCiFfEa1QDkmAgAAEIQKB6BL74QrrttiBaZ8xoGMeWW4Z81sMOa8H6rOXCMWuWtPvukn0hNnFi2A7MHouKAOIV8RrVgCQYCEAAAhBoeQIffSSNHh0mGufOzbz UktJP/1pyGe19qtZe cdaYstJPtCzCWybr2VUlmFsGrhY5olXseMGaPnvikh0a1bN/Xr129J IsWLdKoUaP0xhtvaIUVVtB3v/tdzUwr9Lv uvrxBNPTP3NNmHCBD344IOp/7dv317DnGfyjS1YsEBDhw7V4m Kx/Xp00c7pmWET506VWOdjCOpTZs2GjJkiDp06FAyyukz39fWm6xW8vmcCAEIQAACEKgFAhaqzmf9wx k//43M2I/nnv3ln79a2mDDWqhN03E6A527y799a FdeaPf5TuvVeyx6IiULJ4nTRpktZaay1ttdVWWrhwoS666CIddNBBqZ9tFradOnVSjx49NGPGDN1www06 OCDtXOObTUsPsePH6 BAwdqpZVWSgnVzp076zRngEsaNGiQOnbsmPrZIvehhx5K/W7dddfV7NmzNXz4cPXq1SslaP17W7r4LZY44rVYYhwPAQhAAAK1ROD556WLLgqTil9 mRn56qtLxx8f/q26ai31qolYXeNrxRUl 0Lsppukhx W7LGoCJQsXrN7kS5WZ82alZoJHTBggNq1ayfPwg4ePFjbb7 9errwW5ali1P/yQL1iSeeSM2gerY2EbYWq8ksrEWw2xoxYoTmz5 /RKymC2EfX4ohXkuhxjkQgAAEIBAzga /Dumbzmd94omGkW6ySUgN6NNHWm65mHvSjNhc08uJvfZN2XXXSdOmSfZYVATKIl6zZ1490zplypSMtAAL1A9cJE7SPvvsk5qRtWWLUf/OAnTcuHHq3bu35s2bt0TIJqkA6bOr2cLXM7Gedd1jjz1yCuVC6CNeC6HEMRCAAAQgUAsEFi2SbrxRuuwy6Z//bBix81j9RafzWuvePPP6/vthBrYpu/rqsAuDPRYVgbKIV8 62pKcV6cUvPLKKxniNTnGqQVOMfBX/BawucRmunidNm2a5syZk5HHmohXpxlkpxggXqMaXwQDAQhAAAJVIvCf/0iXXx42FvD/023ZZaVDDpEGDpQ226xKAVbjsl4P48K1hayL8Yyrd2M4 xqRMo1GyHQLPGaLMrq2rVrKv91tJcqplmXLl1SqQNelJUucNNnZt2GBWiSBuDTmXllzEIAAhCAAARKI2BtNny4NG6c9M065yUNtWsnHXusNGCAtNZapbVf02e5015oXkjnL7kkVCawx6Ii0Czxmp7nmt6rXDmvrjzQvXv31IIui9c77rhDZ5xxRionlpzXqMYEwUAAAhCAQA0S8C6mrhyQa1OBLl2CYHVRoEK Ma/B7hcW8vrrSw88INk3Za56tHBh2GULi4pAyeI1V2pAes yqw0kYnX55ZdPldByOawkzYBqA1GNCYKBAAQgAIEaIfDVV9IddwTR uyzDYPedtuQz q10oWsUaqRbpce5ve/L91 u2TflJ1/vvTZZ5I9FhWBksVreo3XpEfpC7Eaq/PqGq9vv/12KqXAqQU26rxGNS4IBgIQgAAEIibwySdhEfzIkQ03jPKmAl4Tffrp0o9 FHEnqhHa4YcHMN6soClzrqvLLpDz2hSpFv97yeK1OZFa2Fr8Wuwm4rU57ZX7XKoNlJso7UEAAhCAQDkIOAXTu2Bdc430TQGfJc22aRM2FfAirLrYVKAcwLLb8AZHTghO2 go72VcN95Jwt/Uj69EOLRZGoGqiFfnvE6fPj1jR67Swq/MWYjXynClVQhAAAIQKI3Aa6 FTQVuuSV8k51u3kjgV78KOa11talAaagaP8t1wQYPLmyfW dbeGHXNxsmVSIc2iyNQFXEa2mhttxZFq FGtvIFkqK4yAAAQhAoFgCjz4aFrv/ c SNxlIN8 unnKKdOSR0jc7rRfbfOs73sVsTzihsKK2J50UprDtsagIIF5z3A5mXqMaowQDAQhAoFURSBZhWbS6qlO2bb99mAw84ADJ a1YEQQMzXmv9k2Zp7M33TRMa2NREUC8Il6jGpAEAwEIQKC1EmhsEZYrBfz852GtUSHpmq2VYZP9PuywANK KXNdMZdrsMeiIoB4RbxGNSAJBgIQgEBrIzB/ftgJy7uQLliQ2XsvwurTRzrjDGm99VobmQr01zkWLsFg35T17Svtuqtkj0VFAPGKeI1qQBIMBCAAgdZCwDtheRGWd8L69NPMXrMIq0Kj4LjjpM03l ybsl/8IuTG2mNREUC8Il6jGpAEAwEIQKDeCTiP9be/lSZObLgIy7OrXoR19NEswqrIOPj1r6V11ilsEdbBB4fdHeyxqAggXhGvUQ1IgoEABCBQjwRcKeDee6WLL5amTm3YQ6dWOp/1wAPZCaui97 Y2q0HHRRmXffbr6Ih0XjxBBCviNfiRw1nQAACEIBAQQRck3Xs2FDuyrVa082VAvyttCcDd9mloOY4qLkEhgwJnw7sm7J99pGOPVayx6IigHhFvEY1IAkGAhCAQD0Q PBD6aqrwm5Y3hUr3ZZdVurVSzrzTGmjjeqhtzXUhwsvlD76SLJvyn7yk5BeYI9FRQDxiniNakASDAQgAIFaJvD222GWdcwY6eOPM3uy8sphIs81Wtdcs5Z7WcOxX3qpNHeuZN Ude8etoa1x6IigHhFvEY1IAkGAhCAQC0ScEqAF2H98Y/SF19k9sA7jHrr1l/ UrKAxapI4MorpVdekeybMpfJOvfcUC4Li4oA4hXxGtWAJBgIQAACtUTgiSdCuatc27d27RpmWXv3lpwqgEVA4A9/kJ56SrJvyrwbxPDh7ArRFKcq/B3xinitwrDjkhCAAARql4ArB7jMlUXrtGkN 7HTTtLAgazzifIO33yzNHmyZN U/fCHIWnZHouKAOIV8RrVgCQYCEAAArES PzzsKGAy129 mpmlK4c4F1HBw WunWLtQfEpTvukG6/XSnflG21lXTddZI9FhUBxCviNaoBSTAQgAAEYiPgxeneutWTcF6QlW7LLScdfnioHLDBBrFFTjwNCDi/w8L1hhuahuOduDxDa49FRQDxiniNakASDAQgAIFYCFiojhgRKgf897 ZUXnhlRdgeTcsKgfEcscKiOP 0OlAfumzEnLEyZI9lhUBBCviNeoBiTBQAACEKg2AS9GdxnQ226TnCqQbknlgF/9SmrbttqRcv2iCTzyiHTeeZJ9U/a974WVePZYVAQQr4jXqAYkwUAAAhCoFoEpU0I 6wMPNIxgk03C9q1UDqjW3SnTdV1pwDfSvinr0kV6 GHJHouKAOIV8RrVgCQYCEAAAi1J4MsvwwyrNxZ4/vmGV3blAG/f6h1CvSgLq3ECzz0X8j3sm7K99w4ltb7znaaO5O8tTADxinht4SHH5SAAAQhUn8Cnn4Y1Oy7jOWtWZjwWqfvuK/3mN1QOqP6dKnMEf/972JvXvilzMvPf/kZSc1OcqvB3xCvitQrDjktCAAIQqA4BL7y65pqwZueddzJjWH75kBZwxhlUDqjO3WmBq3orNNc0s2/KVl1V sc/JHssKgKIV8RrVAOSYCAAAQhUgsD770sjR0pXXSV98EHmFVw5oF /kApJ5YBK0I ozTffDNu92jdlHhhz57Knb1OcqvB3xCvitQrDjktCAAIQaBkC8 aFnbBc7uqTTzKvufrq0sknSyecIK20UsvEw1WqTMD1z7yLRHbB3lxhrbii5E899lhUBBCviNeoBiTBQAACECgHgddfD WuvCNWdrmrddcNs6zHHCO1aVOOq9FGzRCwGN144yBKm7Jllw2feOyxqAggXhGvUQ1IgoEABCDQHAJeh3P dKdd0pffZXZkstdOZ/VO2J961vNuQrn1iyBjz Wtt66sJxXr9z7 uua7Wo9B454RbzW8/imbxCAQCsh8PjjYaZ18uSGHd5mm7B96377Ue6qlQyH/N10mQnnsto3Zq6h5r1/7bHoCCBeEa/RDUoCggAEIFAogfvuC6J16tSGZ y exCt3bsX2hrH1T0Bz6QuvXTTM6qLF0vt2kn2WHQEEK I1 gGJQFBAAIQaIyA0wFuvz2I1hdfzDySGq2MnSYJLLNMEKX2 cw11bwXsD0WHQHEK I1ukFJQBCAAARyEfDCqxtvDBsLeEFWulmHHHZY2Fhgo43gB4FGCHz729J770n2 cz11NZbr2FdNcBGQQDxiniNYiASBAQgAIF8BP73P2n0aGnEiIYVjlwt4KijwkKszp1hCIECCLRvL/3rX5J9PrO43XTTIHKx6AggXhGv0Q1KAoIABCBgAh9 KF1 efi3YEEmE6 5Oe446bTTpI4d4QWBIgissUbIN7HPZ// t7TttpI9Fh0BxCviNbpBSUAQgEDrJjB/fti 1bthffRRJgtvLDBggHT88dIqq7RuTvS RALrrCM99ZRkn8/mzJFOOkm6554SL8JplSSAeEW8VnJ80TYEIACBggk0thuWUwK8sYC3cWVjgYKRcmAuAuuvLz3wgGSfz5xUvffeDZOrIRoFAcQr4jWKgUgQEIBA6yXgSa7f/jYsxvrss0wOG24oDRok9e7d OLw1kuPnhdNYM89pd//XvKuFfns1VdDYWB7LDoCiFfEa3SDkoAgAIHWQeC114Jo/eMfpS yOzzZptJZ50lHXxwKMuJQaBsBLbYInxSss9n3qqtVy/JHouOAOIV8RrdoCQgCECgvglYDwwdKt19d8MtXL0blstd7btvfTOgd1Uk4IVYV1wRFmTlsxkzpGOOkeyx6AggXhGv0Q1KAoIABOqTwLRp0vnnS3/ c8P /ehHQbT Mf12Xd6FRGBnXaShg2T7PPZM89IJ5wg2WPREUC8Il6jG5QEBAEI1BeBhx4K6QGPPNKwX3vtJZ17rrTddvXVZ3oTMQHvGzx4JMJ1HwAAIABJREFUsGSfz7zf8MCBufcdjrhrrSU0xCvitbWMdfoJAQi0MIFJk4Jo9YxruiVbuJ5zjrTlli0cFJeDgKsInHxyqCaQzx59NHyqsseiI4B4RbxGNygJCAIQqF0CX30l3XlnEK0vvJDZj299KyzA8qRX166120cir3ECP/95yGe1z2dTpoTUAnssOgKIV8RrdIOSgCAAgdoj8OWX0s03h d9dnWhZZcNpa4sWrt0qb2 EXGdEejZUzr0UMk n/3lL6Gclj0WHQHEK I1ukFJQBCAQO0Q Pxz6Q9/kC66SHrzzcy4vZnA0UeHOq1rr107fSLSOifgElg9eoRSWPnsT3 Srr1WsseiI4B4RbxGNygJCAIQiJ/A4sXS6NHS8OHS229nxtu2rfTLX4YdsRrbPj7 XhJhXRLo21fadVfJPp/ddVf4KsEei44A4hXxGt2gJCAIQCBeAosWSVdeKV1yifTuu5lxtmsnnXiidOqpkv PQSBKAmecEZKujzgif3i33RaEqz0WHQHEK I1ukFJQBCAQHwE/ve/kAJ46aXS 9nxrfqqtIpp0gnnSSttFJ8sRMRBDIIuH7rxhuHOq75zML1r38N TBYdAQQr4jX6AYlAUEAAvEQ PBD6fLLpZEjpQ8 yIxr9dWl006Tjj9e va344mZSCDQKAF/NeAkbPt85u1jXSbLHouOAOIV8RrdoCQgCECg gQWLgypAd5F0wI23Tp1kn79a m44yQvysIgUFMEvILQeS32 ey660KBYnssOgKIV8RrdIOSgCAAgeoRWLAgfFN61VXSxx9nxuHJKqcL9usnLb989WLkyhBoFoGzz5aWW06yz2fXXCP97W SPRYdAcQr4jW6QUlAEIBAyxPw4iuLVlcQ OSTzOt/97thkuqooyTXbMUgUNMELrhAcrkM 3w2apT0j39I9lh0BBCviNfoBiUBQQACLUdg3jzpd78L3476eZ5uG2wgnXlmWJTt3bEwCNQFAdd386pD 3x22WXSnDmSPRYdAcQr4jW6QUlAEIBA5QnMnRsmnm64Qfrss8zreSH2WWdJv/iFtPTSlY FK0CgRQl49aF31LDPZxdfLL33nmSPRUegZPG6YMECDR06VIsXL1b79u01zHsCptm8efN0wQUX6Isvvkj9tk fPtpxxx3zApgwYYIefPDB1N z20u/Vq62pk6dqrFjx6bObdOmjYYMGaIOHTqUDHv6zPe19SarlXw J0IAAhCIlcCsWUG0jhsneXesdNt007CF60EHIVpjvX/EVQYCTuh 6aWQ2J3PLrxQ ugjyR6LjkDJ4jXpyYgRIzR//vwM8bpo0SINHjxYa621lk477TRNnjxZ9957r8444wytu 66DSBYfI4fP14DBw7USiutlBLFnTt3Tp1rGzRokDp27Jj62SL3oYceSv3Obc2ePVvDhw9Xr169UuLYv7dli liyCNei6HFsRCAQC0QeP11aehQ6Y9/lL78MjPiLbcMovWAA2qhJ8QIgWYSKKSSwHnnSZ58s8eiI1AR8ZouRi0wEzG70UYb6dhjj20AIV2c o8WqE888URqBnXmzJlLhK3bSmZhd955Z/Xs2VPZ4jn72qUQR7yWQo1zIACBGAm89po0ZIh0xx3SV19lRrjNNmHB9T77xBg5MUGgQgT8tcMjj0jXX5//AoVUJKhQeDTbNIGKiFfPtN53330666yz1MkFAb ZPbXPnhHNFqM xgJ03Lhx6t27t5x kAjZJBUgfXY1W/h6JtbX2GOPPVLithRDvJZCjXMgAIGYCLzyinTOOWGHy6 /zoxshx2CaN1775giJhYItBCBW2 V7rlHss9nXqm48sphxSIWHYGKiFfPnD7yyCPq3r279t9/f82aNUsXX3yxVl555QbiNZfYTBev06ZN05w5czLyWBPx6jSD7BQDxGt0Y4yAIACBFiTQmGjdZZcgWvfYowUD4lIQiI3AnXdK48dL9vns9NOlNdeU7LHoCOQVr/6qf9SoUXrjjTcygu7fv7 22mqrJb/LlfM6Y8aM1Myrc2E//fRTrb/ qn/t23bNiVC042Z1 jGBAFBAAI1SMCi1cL07rsbzrTutlsoh7XddjXYMUKGQLkJ/OlP0rXXSvb57OSTJRc4tseiI1CRmVfPtHr1/4ABA9SuXbsGearZFMh5jW5cEBAEIFAjBCxavdjK34JmpwcgWmvkJhJmyxK4/37p0ksl 3x2/vnSOutIffu2bGxcrSACFRGvvvKYMWNS a49evTQtddeqxdeeEFnn3221vQ0fJZRbaCge8VBEIAABJYQsGj9zW kiRMbitbdd5d 1tmWhkuEMhJwIu1XEXAPp/17y/5W2Z7LDoCFRGvTjkYOXJkKtd1qaWW0tJLL52ahd3Yla /qSbgmq7ptV p8xrd2CAgCEAgQgJ//3tYiJVLtDqX1TVcSQ I8MYRUjwEpk6VBg706vD8MXkv5J12CnsiY9ERaLZ4LaVHznP1BgYHHnhgoxsXlNJ2Oc6h2kA5KNIGBCBQTgIWrc5ptWjNNkRrOUnTVt0TeOYZ6YQTJPt81qeP1L27d1iqexy12MGqiFfPsj733HPN2kigkrARr5WkS9sQgEAxBCxandN6770Nz/Kz1RsAdetWTIscC4FWTuBvfwu5rPb57LDDpJ//XLLHoiNQFfEaHYWsgCxeCzW2kS2UFMdBAALFELBodU5rrgXRiNZiSHIsBLIIOGHcdeDt85n/fuih4TgsOgKI1xy3hJnX6MYpAUGg1RCwaD3rLGnSpIZd3nPPUPKKmdZWMxzoaCUIeK9k79Bhn8/22y/Mztpj0RFAvCJeoxuUBASB1kigMdH64x H6gGI1tY4Muhz2Qm89ZbUr580eXL pn/2M lXv5LssegIIF4Rr9ENSgKCQGsi8PzzYSHWffc17DWitTWNBPraYgTmzQtlsOzz2V57SaeeKtlj0RFAvCJeoxuUBASB1kDAotUbDubKafVkjwXtD3/YGkjQRwi0MIH335dcutM n7lYsldK2mPREUC8Il6jG5QEBIF6JtBYyStP8rhOK kB9TwC6FvVCXz0kbT22pJ9Ptt555Bgbo9FRwDxiniNblASEATqkYAXNntzgbvuargjlteO Dm55Zb12HP6BIHICCxaJHXoINnns 23D1vI2mPREUC8Il6jG5QEBIF6IvDaa0G03nFHQ9HqklfeQp0dserpjtOX6Al88YXUpo1kn8/89cc11/A1SKQ3E/GKeI10aBIWBGqbgKvwOKf11lulr77K7Mtuu4WZVkRrbd9joq9hAkstFV6Y9rmsV69Qs27TTWu4k/UbOuIV8Vq/o5ueQaAKBObMCaJ13Djpyy8zA9hxR2nYsLBlOgYBCFSRwHLLSR9/LNnnsu9/X7r9dskei44A4hXxGt2gJCAI1CKB996Thg6VrrtO uyzzB44bc5/8yYDGAQgEAGBtm2ld96R7HPZRhuFPZntsegIIF4Rr9ENSgKCQC0RWLBAuvBC6corG67/cClJ57T 9Ke11CNihUArINC vfSvf0n2uWy99aQpUyR7LDoCiFfEa3SDkoAgUAsE/I3jJZdIl13WsOJO165hpvXAA/On1NVCH4kRAnVLYI89QkJ6x465u9i5s/Tkk5I9Fh0BxCviNbpBSUAQiJmAq uMGiUNHy795z Zka6/fsh3/cUvpKWXjrkXxAaBVk7AdV6nTQv1XnNZp07SjBmSPRYdAcQr4jW6QUlAEIiRgKvqOJ/1vPMa7irp55834zn6aGmZZWKMnpggAIEMAk2lBXhG1sWZ883MgrOqBBCviNeqDkAuDoHYCXz9tXTbbWG7Vpe/SrfVV5fOPFM67jhp eVj7wnxQQACSwh4e9h77gnbxOaypnJiQVlVAohXxGtVByAXh0DMBP7yF k3v5Gefz4zylVWkU4/XTr1VGnFFWPuAbFBAAI5CWy2mTR vGSfy5qqRgDWqhJAvCJeqzoAuTgEYiTw3HPSCSdIf/1rZnTelMe/t6Bt1y7GyIkJAhAoiMDWW0vXXivZ5zK/2BcuDDtxYdERQLwiXqMblAQEgWoR8FauZ5whTZyYGYHzWI88MlQQYP1Gte4O14VAGQm4 PKll0r2uexb3woFm 2x6AggXhGv0Q1KAoJASxN4662Q0 pdsdK3cvXOkQcdFHbF6tKlpaPiehCAQMUI7LJLWH1pn8v84nfCOxYlAcQr4jXKgUlQEGgJAh98IF1wQdhg4NNPM6 4117SxRfnT4lrifi4BgQgUCEC3btLgwZJ9tnm0iJOF7DHoiSAeEW8RjkwCQoClSTgWq3 xtDi9MMPM6/kFLiRI6WddqpkBLQNAQhUlYC3vXMCe67t7xYvlnbYIdR5xaIkgHhFvEY5MAkKApUg0FitVlfM d3vpP33r8SVaRMCEIiKwH77SX37SvbZ9tFHYfMCeyxKAohXxGuUA5OgIFBuAnfcETYS Mc/Mlteay3p3HOlo45ibUa5mdMeBKIl4Bf8z34W9nDOtgULpA02kOyxKAkgXhGvUQ5MgoJAuQg89ph02mnS9OmZLbpW68CB0imnSCusUK6r0Q4EIFATBLyHs1MG7LPt3XelzTeX7LEoCSBeEa9RDkyCgkBzCbzwgvTrX0sPPtiwpZNOkoYMkTp0aO5VOB8CEKhJAk4Z2HXXkDqQbXPnStttJ9ljURJAvCJeoxyYBAWBUgm8 WbYROCPf8ysdLP00lKvXiGvdZ11Sm2d8yAAgbogcOyxUrdukn22zZol7b67ZI9FSQDxiniNcmASFASKJTB/fthEwJvmfP555tl77x0qC2y6abGtcjwEIFCXBI4/XuraVbLPNifG9 jRMEG LkHUZqcQr4jX2hy5RA2Bbwj897/S8OGh9NUnn2Ri2WKL8PvddgMXBCAAgTQCTnbv3DkkvWfbK69IPXtK9liUBBCviNcoByZBQaApAt650ZsLOA3g/fczj95wQ n886WDD26qFf4OAQi0SgJerbnaamHVZrY5Yb5PH8kei5IA4hXxGuXAJCgI5CPg7VvHjg0LrubMyTzKZa/8 6OPpuwVIwgCEGiEgBPjV1wxJMhn23PPSb/8pWSPRUkA8Yp4jXJgEhQEchGYODE8a15 OfOv7dtLZ5whnXyytPzysIMABCDQBIHzzgvbv9pn29NPS6eeKtljURJAvCJeoxyYBAWBdAJTp4ZnyTPPZHJxfVaXvTrrLGnllWEGAQhAoEACF14YdtCyz7bHHw87mthjURJAvCJeoxyYBAUBE3jppTCj uc/Z/JYZpmwI5bzWldfHVYQgAAEiiTgsiTeQWvQoNzi9Q9/kG66qchGObylCCBeEa8tNda4DgQKJvD669I550i33SY5xzWxpZYKi4Avukjq0qXg5jgQAhCAQCaBUaNCKSz7bLv//lCmxB6LkgDiFfEa5cAkqNZJwAuwXKvVEx5ffpnJoHv38DzZbLPWyYZeQwACZSQwerQ0Y4Zkn22TJknXXCPZY1ESQLwiXqMcmATVugi8915YNzFmjOQSWOnmWq2eHNlpp9bFhN5CAAIVJHD99dKTT0r22Xb33aGkiT0WJQHEK I1yoFJUK2DgFPOXKf1qqukRYsy zdsCxo99 /dbCglxCAQAsSuPlmafJkyT7bbr9dmjBBsseiJIB4RbxGOTAJqr4JeJGvt2u9/HLJO2Sl2/e J517rnTYYZJzXDEIQAACZSfQmEC95ZawStQei5IA4hXxGuXAJKj6JODtW0eOlC65RPrgg8w eqdGL9Lq25cNBurz7tMrCERE4J57pBtvlOyzzb9/9NHwdyxKAohXxGuUA5Og6ovAp5 G1IBhwyTnt6Zbp06hTuuxx0rLLVdf/aY3EIBApAQ8s3rFFQ3r8DlcJ9 7qLQ9FiUBxCviNcqBSVD1QeDzzyWXS7zgAunf/87s06qrhhquJ5wgebMBDAIQgECLEZgyJXyats82f9J2kWl7LEoCiFfEa5QDk6Bqm4B3XbzhhrAY6803M/uyyiphtyz/a9u2tvtJ9BCAQI0SaGwXLSfj/ tfISkfi5IA4hXxGuXAJKjaJGDR6sozFq2zZ2f24dvflk48Mcy2tmtXm/0jaghAoE4IPPus9PvfS PGNeyQk/LfeSck52NREkC8Il6jHJgEVVsEkvQAbxPujQbSrU0b6Ze/lH7zG2m11WqrX0QLAQjUKQFvUHDMMWGjgmzzG5lLothjURJAvCJeoxyYBFUbBCxar7suvMe/9VZD0dqvXxCta6xRG/0hSghAoJUQcE7roYeG3NZs8/7T3pf6zDNbCYza6ybiFfFae6OWiKtOwKLVC3G93iGXaHXlAFcQQLRW/VYRAAQgkIvAP/4h9egh2Wfb4MGSvzKyx6IkgHhFvEY5MAkqTgIWrddeG0Tr3LmZMbpiQP/ 0qBBiNY47x5RQQACSwh4JemuuzZcUeoDnJjfoUPwWJQEEK I1ygHJkHFRcB1WpOZ1uySVyuuGESrv2Hr2DGuuIkGAhCAQE4Cb78tdesm2WebS6GsvXYoiYJFSQDxiniNcmASVBwEvHXrNddIl10mzZuXGZNF63HHhckJRGsc94soIACBAgm8/7608caSfba5LMqGG4byKFiUBEoWrwsWLNDQoUO1ePFitW/fXsP8PWKaXXPNNXr eeX/KZt27a64IILtEKeauQTJkzQgw8 mDo u730a/nvffr00Y477rik7alTp2rs2LGpn9u0aaMhQ4aog6f8S7TpM9/X1puwLLpEfJxWBwTmzw8lDq 8Ulq4MLNDLnn1q1 F9IBmvMzqgBJdgAAEapaAqwl4dtU 21weZYstQpkULEoCJYvXpDcjRozQ/PnzG4hXC1sL1YEDB2rRokUaNWqUunfvrq222qoBCIvP8ePHp45daaWVUqK4c fOOu2001LHDho0SB07dkz9bJH70EMPpX637rrravbs2Ro fLh69eqVErT vS1bTBdDH/FaDC2OrScCzmP1QlvvirVoUWbPLFS9G9bJJ/sDZj31mr5AAAKtjsDixaHgtH22HX20tMMOkj0WJYGKiVeLyPXWW0/HetlxaqvgMdp6661zitd0cepjLVCfeOKJ1AzqzJkzlwhbi9VkFnbnnXdWz549lS2e04Wwjy/FEK lUOOcWibw2mthY4Hx4yVvNJBuSeqX81qdKoBBAAIQqHkCLoW1zDKhJFa29ekjde/ur3lrvpv12oGKideRI0emhKdtww031EYbbaQeLkuRZdli1H 2AB03bpx69 6tefPmLRGySSpA uxqtvD1TKxnXffYY4 UuC3FEK lUOOcWiTw3HPSBRdI994rff11Zg cDjZwoNS7d3iPxyAAAQjUFYEf/Uh69FFp6aUzu X6r/vtF rAYlESqJh4XbhwoS666KLUTKmtW7du6ueK5VmWS2ymi9dp06Zpzpw5GXmsiXh1mkF2igHiNcpxRlCREZg4URo5MrxvZ5tTvc45R9p//8iCJhwIQAAC5STgNTjWKNlrcQ48UOrVS7LHoiSQV7wmeapvvPFGRuD9 /fP Oo/V85rdo7r5MmTNXHixNRCq 233z6jPWZeoxwXBFWHBFzuyusaXTngmy9FMnq5115hEZZLH2IQgAAE6p7AKquE/azt0 3nPw9bx9pjURKoyMzrrFmzNHr0aFnodunSRTNmzEhVA/je976n448/vgEIcl6jHBsEVScE/vMf6YorpKuukt57L7NT3/qW5Owaz7R27VonHaYbEIAABAoh4Bp/r7zSsNbfT34inXSSZI9FSaAi4jVJGfDqf eeXn755amKBLvttlvOvFeqDUQ5Ngiqxgm8/rp0ySVhtjW7coDLXR11lOSCHiWua6xxOoQPAQi0egLf Y70zDOSfbp5darTBnbZpdUjihVARcSrO5u YMs/p e8JjVd0 u1Uuc11iFCXLVGwHmsl14qTZrUcBFWp06h7rbrtGZ/U1Zr/SReCEAAAs0isN560pQpkn26WbSedx7itVlwK3tys8VrKeE5z9UbFhx44IEZmw2U0lYlzqHaQCWo0mYlCXz2mXTrrWFjgRkzGl5ps83CToe/ IW07LKVjIS2IQABCNQIAZdUueeesNNWunltjmcAstbo1EivWkWYVRGvnmV97rnnmrWRQCXvDuK1knRpu5wEvLOhd8G6 mrp3XcbtvzjH4fUAHsMAhCAAATSCGy uXTzzZJ9unXrFvbFtseiJFAV8RolibSgLF4LNbaRLZQUx5WTwN//Lo0YEWZbXUUg3ZZbTjrssFCjlUVY5aROWxCAQF0RyCdS84nauup8bXcG8Zrj/jHzWtuDul6j90Yw/obLqQGPP96wl6uvHrbidkEP/x DAAQgAIFGCHgLWK9qtU 3TTaR7rpLsseiJIB4RbxGOTAJ6v8JuIb2mDEhNWD27IZkvKnAgAFhcaxnXTEIQAACECiAQN 0tFHSzvvnHnwBhtIkydL9liUBBCviNcoByZBSU4N8JoBpwYsXpxJxPVZXT/bopVqLowWCEAAAiUQ8M4sXslqn26dO0tPPinZY1ESQLwiXqMcmK01qM8/l 64I2wq8PTTDSm0axcmCixa11mntVKi3xCAAATKQGCffaRjj5Xs0801BV22xR6LkgDiFfEa5cBsbUG9805IC7j2Wsn/zzaXunIua58 Dbfhbm2s6C8EIACBshA48MCQb2WfbqutJr36qmSPRUkA8Yp4jXJgtpagnngilLry2gDPuqbbMstI 0nnXACqQGtZTzQTwhAoAUJuCyL86/s023llaW5cyV7LEoCiFfEa5QDs56D t//wpatLiP44osNe7rGGuGbLO Cteaa9UyCvkEAAhCoIoEjjpB2312yT7dttw0lXdq0qWJwXLoxAohXxCuvkBYi8Mor0qhR0i23SP/9b8OLejMXz7IedBC7YLXQLeEyEIBAaybQr59koWqfbl4R620L7bEoCSBeEa9RDsx6Ccrvf7ffHmZZp05t2KsVVgjfWJ18suS8VgwCEIAABFqIgBcSeCcX 8S /lpaemnJHouWAOIV8Rrt4KzlwFyP1bmsN9wgeQvXbPve96T /UPlAFcQwCAAAQhAoIUJnHJKKIdln5i3LHSua/bWhS0cGpdrnADiFfHKa6RMBLwD1p/ FKoGPPBAww/uXoDltQHeBWvPPct0UZqBAAQgAIHSCAwbFoSqFxgk5pyutdbKndtV2lU4qwIEEK I1woMq9bV5L//HXbA sMfwgLVbPvOd0JKlWdaWYDVusYGvYUABCImcM45kmcV7BPzlobeWcsei5YA4hXxGu3gjDmwL7 UJk0KovUvf5E865puSy0VZlc9y rZVvL Y76bxAYBCLRKAr/7nfTxx5J9Yi607T23cxXcbpWQ4uw04hXxGufIjDSqt94KGwlcf7309tsNg1x1VenII6XjjpPWWy/SThAWBCAAAQhII0aEN3L7xObMkXbaSbLHoiWAeEW8Rjs4YwnMs6z33htEq3NZs2dZHecuu4TarD17SsstF0vkxAEBCEAAAnkJeB9u76Rln9jrr0t77y3ZY9ESQLwiXqMdnNUOzLOsLnHlWdZc3yB550DXtnZqgFOkMAhAAAIQqCECzvt65pmQ/5XYzJnSAQdI9li0BBCviNdoB2c1AnNdVm/V6sVXDz3UsGKAc1l33TXMsno77GWXrUaUXBMCEIAABJpNYNy48HWafWIvvCD16SPZY9ESQLwiXqMdnC0ZmHe/Gj1auvnm3ItMO3aU vYNs6zksrbkneFaEIAABCpEwDvITJgQdpJJbMYMafhw6dZbK3RRmi0HAcQr4rUc46gm23A5v/Hjwyzrs8827IJnWb3ttWdZ99 fWdaavMkEDQEIQCAfgYkTQ16YfWLeCnHgwNxbIkIyGgKIV8RrNIOxpQJ54okgWO 4Q/rkk4ZXdV1Wz7K6Nuu667ZUVFwHAhCAAARalMDDD4eZ16uu v/L ncXXCDZY9ESQLwiXqMdnOUM7L33pBtvDB yX3utYcvOXd1nH moo8JCU qylpM bUEAAhCIkMAjj0jnnSfZJzZ5sjRypGSPRUsA8Yp4jXZwNjewL74IGwnccIP05z9L/jnbNtkkCFbPtLp6AAYBCEAAAq2EwNNPS6eeKtknliuVoJXgqKVuIl4Rr7U0XguK1YuvrrsuLL6aP7/hKW3bSgcfLB19tLTDDgU1yUEQgAAEIFBvBLw465hjJPvEnE/mBVz2WLQEEK I12gHZzGBLVwo3XJLmGWdPj33mdtvHwTrYYdJK65YTOscCwEIQAACdUfg5ZfDTIZ9Yp71cMqAPRYtAcQr4jXawdlUYN7pyiX6LFj9Tc nnzY8o1MnqXfvkBqw0UZNtcjfIQABCECg1RDItZuWF0Y8 WRYIIFFSwDxiniNdnDmC8zvNxasN90k/fvfDY/y9qxefHXkkSy qrmbS8AQgAAEWoqAt1F07ph9YldfLb34omSPRUsA8Yp4jXZwpgf28cehZrQrBrgMXy77wQ CYPVMa4cONdEtgoQABCAAgWoRcBmaTTeV7BO7/HLpX/ S7LFoCSBeEa/RDs6vvw5btHqG1Vu25qrJuuqqUq9eQbRuuWW0XSEwCEAAAhCIjcBHH0ldu0pz52aK1w8 kM49N7ZoiSeNAOIV8RrdC2L27FAtYOxYac6chuG5BuuPfxwE6377sfNVdDeQgCAAAQjUAgEvlFh55cwFE efL332mWSPRUsA8Yp4jWJw/u9/0m23hbQA74CVy/ztTp8 0hFHSKuvHkXYBAEBCEAAArVMwPuA 2u xH7zm1COxh6LlgDiFfFatcHp94tHHw2C9c47JQvYbOvYMZS2smjdeuuqhcqFIQABCECgHgm0aSO51qK97fTTpTXXDB6LlgDiFfFalcF56aXSZZdlphqlB LSe85l3XffqoTHRSEAAQhAoDUQaN E6rbcAAAWG0lEQVQ LNCyt514orThhsFj0RJAvCJeW3xweqbV arZts02oR6rZ1pXWaXFw KCEIAABCDQ2gi4GLh32LK39esnbbtt8Fi0BBCviNcWH5zPPSdZqNr8ftG3b8hjZROBFr8VXBACEIBA6ybQpYv08MOSvc05at27B49FSwDxinityuB0CSznvPo9AoMABCAAAQhUhcAmm4RajPa2Qw6RDjggeCxaAohXxGu0g5PAIAABCEAAAhUlsP/ oaard7mxuf6ivw60x6IlgHhFvEY7OAkMAhCAAAQgUFEC3h72kkvCNrE2rxS2eHUxcSxaAohXxGu0g5PAIAABCEAAAhUlsMce0llnSfa23XaTzjkneCxaAohXxGu0g5PAIAABCEAAAhUl0KOH9MtfSva27beXXMvRHouWAOIV8Rrt4CQwCEAAAhCAQEUJHHSQ5MLi9rYtt5Suvz54LFoCiFfEa7SDk8AgAAEIQAACFSWQXRoru/pARS9O46USQLwiXksdO5wHAQhAAAIQqG0C/ftLW20l2duy677Wdu/qNnrEK K1bgc3HYMABCAAAQg0SmDgQKlzZ mEE8Jha60leScdeyxaAohXxGu0g5PAIAABCEAAAhUlcOaZ0sorS/a2Dh2k118PHouWAOIV8Rrt4CQwCEAAAhCAQEUJXHCBtHixZG9zvVdvF9umTUUvS PNI4B4Rbw2bwRxNgQgAAEIQKBWCbgs1ty5oTyWbamlwt7lWNQEEK I16gHKMFBAAIQgAAEKkbgmmukv/1Nsl 0KKQL2GNRE0C8Il6jHqAEBwEIQAACEKgYgbFjpSlTJPsFC6QNNggei5oA4hXxGvUAJTgIQAACEIBAxQhMmCDdeqtk7/SB7bYLHouaAOIV8Rr1ACU4CEAAAhCAQMUIPPigdNdd0tVXS//8p/TTnwaPRU2gZPG6aNEiDR48WB9//HGqg926dVO/fv1S//ffRo4cqVmzZmkpJz9/Y nHZFOZMGGCHvQgktS fXsNGzZsySELFizQ0KFDtdgrAiX16dNHO 6445K/T506VWM95S8vEGyjIUOGqEMzylxMn/m tt5ktahvHMFBAAIQgAAEINBMAo8/Lg0eLNm/8IIFRvBY1ARKFq TJk3SWmutpbfffluzZ8/W3LlzddBBB2kr71QhacyYMerUqZN69OihadOmady4cTr00EO18847NwBi8Tl /HgNHDhQK620Ukqodu7cWaeddlrq2EGDBqljx46pny1yH3roodTv1l133dS1hw8frl69eqUErX9vSxe/xd4BxGuxxDgeAhCAAAQgUIMEZsyQjjlGsn/2WemKK6SbbqrBjrSukEsWrwkmi9h58 alfkzEqmdcPRM6YMAAtWvXTk8//bRuvfXW/2vv/kOrqv84jr Jfg1xqWmgRTGGxNZ/JvQFLQkNJDZB1D8UtT9C9kdNIymDhBIMVBwhg4EZ/bAlhP3Rj/3ngkAFCRsEuZEwpBUTcYgMU/sBfnl/xudydnZ 3XPOved87n0eENl2fnzO4/05n/u6Z597Jlu3bpX/6XwS3 INp/ojDahnz541d1DHxsYqwVbDqr0LqyF48 bN0tfXJ9evX6 EVW8Q1vXTLITXNGpsgwACCCCAgGMCly LdHWJ6P/6wS39ra/ z1JqgVzCq//O68jIiAwPD0tvb6/8/fffcuzYMXnkkUdk3rx5lakFVsUfRvX7GkD1Tu2OHTtMMLZB1k4F8N5d9QdfbYvedV27dq0Jt2kWwmsaNbZBAAEEEEDAMYHJSZ33KKL/f/utyCefzPzPUmqBXMLruXPnpL29vRJM9W7s6OioCa/6K357Z1Yl7LxYqxIUNr3hVaccTExMzJrHasOrTjPwTzEgvJa6v9E4BBBAAAEEyiMwPS3yxBMi v pUyJDQzP/s5RaIDS86oeu vv7ZXx8fNYJ9PT0VOa16joaHltaWky4tIu989rd3S2ff/656DZ6JzYovHLntdT9g8YhgAACCCDQ2AIPPCDy778iH30kcvHizP8spRbIdOdVP5Q1PT0tra2ts 6o2jmvixcvlgcffFC2b99ugvC6desqwderwpzXUvcRGocAAggggEDjCsyfPzNt4OOPRSYmRD78sHHPtUHOLHV4tVMDli9fLlNTU3OmAwwMDMhvv/0mr7zyiqE6ffq07Nu3z3yAy7/wtIEG6U2cBgIIIIAAAq4JPP64yE8/zTzvVe/Avvmma2fQdO1NHV71rutFvb3uWXSagD4aSxd9wsDg4KD8999/ZlqBPnmgra3N/Mw 09X7vFae89p0fY8TRgABBBBAoHiBjo6Z4Kof1nrsMZG33iq TbQgUiB1eM3iqvNcDx48KJs2bZr1xway7DPPbXnaQJ6a7AsBBBBAAIESC2zcKPLuu/qAehF9Vn1PT4kbS9NUoJDwqndZ9a5tlj8kUMvyEV5rqcu EUAAAQQQKJHA vUib7wx88cJNmwQ2bq1RI2jKUEChYTXspdCw2vShT8jm1SK9RBAAAEEECihwLZtM3 oYHBQ5PXXRV5 uYSNpEleAcJrQH/gzisXCQIIIIAAAk0i8NprIp2d heSRHbvFgn4S6BNIuHMaRJeCa/OdFYaigACCCCAQO4CfX0i998vMjAg8t13Ik8/nfsh2GG AoRXwmu PYq9IYAAAggg4JKAhtZffxX56iuRy5dFHn3UpdY3ZVsJr4TXpuz4nDQCCCCAAAJG4JtvRD77TOTnn0X AMUBwQIr4RXB7opTUQAAQQQQKBGAvrM sOHRS5cILzWiDjv3RJeCa959yn2hwACCCCAgDsCt26JLFki8txzIj/ 6E67m7ilhFfCaxN3f04dAQQQQAABEXnxRZEXXhA5cAAOBwQIr4RXB7opTUQAAQQQQAABBGYECK EV64FBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGYHU4fXOnTuyf/9 uXXrljnZlStXyq5duyonfuLECbl48WLl6/vuu092794tHR0dgThff/21nDlzxvxs4cKFcujQocp6N27ckAMHDsjdu3fN93bu3CmrVq2q/Pz8 fNy8uRJ8/XDDz8s7733nixatCh1EX4em5JnOxan3p4NEUAAAQQQQAABBGojkDq8Dg0NybJly2RyclJ //13 fPPP2XLli2yYsUK09J33nnHBMi33347tuUaPk dOmXWnT9/vgmqTz75pOzdu7eyryVLlpivNeT 8MMPZv9PPfWUOfaRI0dk27ZtJtDq93Xxht/YBvhWILxWK1b9 hhXb5b3FtQgb9F0 6MO6dzy3Ioa5KmZbl/UIJ1bnlu5VIPU4dWCaYi9evWq XLp0qXS1dUlN2/elPfff1/Wr19v/sUtGjhtONV1NaCePXvW3EEdGxurBFsNq/Yu7PPPPy bN2 Wvr4 uX79eiWseoOwrp9mcamAac6vDNtgXHwVqEHxNdAWUIfi60ANqEHxAsW3wKXrIJfw6r/zOjIyIp9 qn8888/phr37t2TDRs2mGDrX/xhVH uAfSLL76QHTt2mGBsg6ydCuC9u oPvtoWveu6du1aE27TLC4VMM35lWEbjIuvAjUovgaEV2pQDoHiW8F4RA2qEcglvJ47d07a29src141vB4/fly6u7tl9erV8sEHH8jt27fl1VdfrUwrsI0MCpve8HrhwgWZmJiYNY/VhledZuCfYkB4rab8xa3LQFWcvT0yNSi BoRXalAOgeJbwXhEDaoRCA2v oGs/v5 GR8fn7W/np6eSgDVdTQ8trS0mHBpFw2vw8PD0tvba36mX3/55ZcmyG7cuHHW/rjzWk25GmddBqria0kNiq8B4ZUalEOg FYwHlGDagQy3XnVJwpMT09La2vrrCcNXLlyxXz6f8 ePbJgwQITXnUawZo1awJ/lc c12pK1hjrMlAVX0dqUHwNCK/UoBwCxbeC8YgaVCOQOrzqB7VGR0dl fLlMjU1NSu82ru2nZ2dZu7p0aNH5dq1a ZpAW1tbXPax9MGqilZY6zLQFV8HalB8TUgvFKDcggU3wrGI2pQjUDq8Op/jqseVOe42g9lDQwMyC //FJpi3e6gX2mq/d5rTzntZqyub8uA1XxNaQGxdeA8EoNyiFQfCsYj6hBNQKpw2s1B/Gvq/NcDx48KJs2bZr1xway7DPPbbmI8tQM3hfGtTeOOwI1iBOqz8 pQ32co45CDahB8QLFt8Cl66CQ8Kp3WfWvb2X5QwK1LLNLBaylQy33jXEtdZPtmxokc6r1WtSh1sLx 6cG8Ua1XoMa1Fo4fv8u1aCQ8BpPWPwaWkQWBBBAwDWB1nkPyPRf/7rWbNqLAAIIyLMdixMpEF4TMbESAggggAACCCCAQBkECK9lqAJtQAABBBBAAAEEEEgkQHhNxMRKCCCAAAIIIIAAAmUQILyWoQq0AQEEEEAAAQQQQCCRAOE1ERMrIYAAAggggAACCJRBgPBahirQBgQQQAABBBBAAIFEAoTXREyshAACCCCAAAIIIFAGAcJrGapAGxBAAAEEEEAAAQQSCRBeEzGxEgIIIIAAAggggEAZBAivZaiC4224efOmHD58WG7cuGHOpKenR1asWFE5qzt37kh/f7 Mj49LS0uL7NmzR9ra2szPvT9buXKl7Nq1a47G0NCQfP/995Xv /fvOF9uzT9x4oT5s8u6 C2jaqDr223b29ult7fX1Mku3v3a7wWtl9uJOLyjqBp4nYOuk6ga LfFP7yTeMeLuP7sH0tGRkbk PHjc8YpezTvvsPGK4e7b25Nj6uBdQ4aq65cuSLHjh0zrw3 1wtdP2rb3E6gAXaUxTHuNT1urKoHH G1HsoNfAwdYAYHB2XLli2yYMECM7CcPn1a9u3bZ762L7pLly6Vrq6uwJ/rOjrYXb16dU541e Pjo7OCVQNTJrq1NRp2bJl5k2DHXi0JvZNhA42cTXQ2g0PD8dae/eVqrENulFcDbx9XF9YNCRpeLJv5OwLc1AN/LWhBsGdSJ0mJyfNWGPfsHV2dpqv/eNMWA30 tHwtHPnzjm18Y5t1CBdDdT95MmT5ibGQw89ZG5s2BqpvRpv377dBFf/ B 1bYMOK6lOK4tjktf0qLEqVYNTbER4TYHGJuEC/oHfO9homLUvKOvWrZt1dzYovIati3 8gPeFNWkNkoRX/77iW9K8a3hrEBSIgsJPWA3814d rYsNZc2rHH3mXrekNQgLr/56cS0k63X vut3jBp3/MbVbJusdc2xVhbHqDdzSW521EqY8For2Sbdr//Oa9DApAOQLt4pAkHh1d4Z0V/PnTlzxmzDr riO5b/zmvSGsSFV95MxNvbNfw1CAo6Qb9VCKuB3d/ChQtl9erVcunSpcApNslb2Phr u 8Jq1BNeE16O5548smP0N/DYLGkLA74HoU7zWiX tdWu Nj6htk7ey8dfM4hj021QVi3u9qLUq4bXWwk20/6BfVwe9QFcTXvXXd88884x5obb7X7VqFXecIvqV3zdpDeIGo7ifN1FXjz1Vfw2CXgCqCa/eOct68O7ubq6BmCr4fZPWICy86v7Onz9fmRKlNdY3Ed45/LEdo8lW8Ncg6DUiLID6v1/Ntk3GHHm6WRyDzO3Bin49ILzSy3MRqGYOXzXh1c6NsvNnw bG5nISju8kaI5f2DvkoBpEDUZRg5jjbLk2P6wGSe/6hdXAPwVBPyDJm7jw0gX176Q1CAuvejTvB/JeeumlSni141OuncnxnQXVIOmd16A3Gkm3dZwt1 ZncYy7q014zbVU7KwIgajBPul8y6BQGrRfwmv0C7b9UJZ3raQ1iBqM OBcsisr7EM8SedbBtUg6I1D0S8cyTSKWStsjEhag6jxzHtG1CC8vlHjdNy81ai5xHHbFtPjynnULI5JroGi z93XsvZ75xpVdidJu8JJPmke9hg5333zt2/6BeLqKcyJKlB2GCUpMbOdNgaNjQu4Kd92oD11/mudp540F2tGp6aM7sOm59nTyBJDZK8cDMWhXeJuBrEPW1Af6vgfVJK2Btx/5MKnOmkdWhoXP MqkHS8Z7wWodCcojaCdiLxD7jVY8U9SzXoOf26TZh4ZW5fslqF/QsVu 8yLjnvOpRwgajuF8fJWth468VVwMV8K4T9LziuA9s2euM57wG9ycdR7zPhNa1/B/yjKtB1Ker9QNaduF50 lroP3cWnrr4302qd37okWLZj16MWzbxh9hkp9hFsckr lRrxfJW5ltTe68ZvNjawQQQAABBBBAAIE6ChBe64jNoRBAAAEEEEAAAQSyCRBes/mxNQIIIIAAAggggEAdBQivdcTmUAgggAACCCCAAALZBAiv2fzYGgEEEEAAAQQQQKCOAoTXOmJzKAQQQAABBBBAAIFsAoTXbH5sjQACCCCAAAIIIFBHAcJrHbE5FAIIIIAAAggggEA2AcJrNj 2RgABBBBAAAEEEKijAOG1jtgcCgEEEEAAAQQQQCCbAOE1mx9bI4AAAggggAACCNRRgPBaR2wOhQACCCCAAAIIIJBNgPCazY tEUAAAQQQQAABBOooQHitIzaHQgABBBBAAAEEEMgmQHjN5sfWCCCAAAIIIIAAAnUUILzWEZtDIYAAAggggAACCGQTILxm82NrBBBAAAEEEEAAgToKEF7riM2hEEAAAQQQQAABBLIJ/B/MRo982v YYAAAAABJRU5ErkJggg==`
  719. // image := `data:image/jpeg;base64,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`
  720. // b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, image)
  721. // if !b {
  722. // fmt.Println("regexp.MatchString")
  723. // return
  724. // }
  725. // ext := ".png"
  726. // uploadDir := "./static"
  727. // randStr := utils.GetRandStringNoSpecialChar(28)
  728. // fileName := randStr + ext
  729. // fpath := uploadDir + "/" + fileName
  730. //
  731. // re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
  732. // base64Str := re.ReplaceAllString(image, "")
  733. // base64Str = strings.Replace(base64Str, " ", "", -1)
  734. //
  735. // err = utils.SaveBase64ToFile(base64Str, fpath)
  736. // if err != nil {
  737. // return
  738. // }
  739. // fmt.Println("end")
  740. //
  741. // defer os.Remove(fpath)
  742. //
  743. // hzUploadDir := "static/images/"
  744. // savePath := hzUploadDir + time.Now().Format("200601/20060102/")
  745. // savePath += fileName
  746. // //上传到阿里云
  747. // err = services.UploadFileToAliyun(fileName, fpath, savePath)
  748. // if err != nil {
  749. // return
  750. // }
  751. // fileHost := "https://hzstatic.hzinsights.com/"
  752. //
  753. // resourceUrl := fileHost + savePath
  754. // fmt.Println("resourceUrl:", resourceUrl)
  755. // utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
  756. // utils.FileLog.Info("end update oss ")
  757. // fmt.Println("end")
  758. //}
  759. // 判断文件是否存在
  760. func IsFileExist(filename string) bool {
  761. _, err := os.Stat(filename)
  762. if os.IsNotExist(err) {
  763. return false
  764. }
  765. return true
  766. }
  767. // @Title 图片上传
  768. // @Description 图片上传接口
  769. // @Param file query file true "文件"
  770. // @Success 200 新增成功
  771. // @router /image/uploadV2 [post]
  772. func (this *ResourceController) UploadV2() {
  773. br := new(models.BaseResponse).Init()
  774. defer func() {
  775. this.Data["json"] = br
  776. this.ServeJSON()
  777. }()
  778. businessType := this.Ctx.Request.Form.Get("business_type")
  779. //this.Ctx.Request
  780. fmt.Println("businessType:", businessType)
  781. fmt.Println(this.Ctx.Request.Form)
  782. fmt.Println("===========")
  783. br.Data = businessType
  784. f, h, err := this.GetFile("file")
  785. if err != nil {
  786. br.Msg = "获取资源信息失败"
  787. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  788. return
  789. }
  790. fileData, e := ioutil.ReadAll(f)
  791. if e != nil {
  792. br.Msg = "上传失败"
  793. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  794. return
  795. }
  796. pass := filetype.IsImage(fileData)
  797. if !pass {
  798. br.Msg = "文件格式有误"
  799. br.ErrMsg = "文件格式有误"
  800. return
  801. }
  802. ext := path.Ext(h.Filename)
  803. dateDir := time.Now().Format("20060102")
  804. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  805. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  806. if err != nil {
  807. br.Msg = "存储目录创建失败"
  808. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  809. return
  810. }
  811. randStr := utils.GetRandStringNoSpecialChar(28)
  812. fileName := randStr + ext
  813. fpath := uploadDir + "/" + fileName
  814. defer f.Close() //关闭上传文件
  815. err = this.SaveToFile("file", fpath)
  816. if err != nil {
  817. br.Msg = "文件上传失败"
  818. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  819. return
  820. }
  821. resourceUrl := ``
  822. //上传到阿里云 和 minio
  823. //if utils.ObjectStorageClient == "minio" {
  824. // resourceUrl, err = services.UploadImgToMinIo(fileName, fpath)
  825. // if err != nil {
  826. // br.Msg = "文件上传失败"
  827. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  828. // return
  829. // }
  830. //} else {
  831. // resourceUrl, err = services.UploadAliyunV2(fileName, fpath)
  832. // if err != nil {
  833. // br.Msg = "文件上传失败"
  834. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  835. // return
  836. // }
  837. //}
  838. ossClient := services.NewOssClient()
  839. if ossClient == nil {
  840. br.Msg = "上传失败"
  841. br.ErrMsg = "初始化OSS服务失败"
  842. return
  843. }
  844. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  845. if err != nil {
  846. br.Msg = "文件上传失败"
  847. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  848. return
  849. }
  850. defer func() {
  851. os.Remove(fpath)
  852. }()
  853. item := new(models.Resource)
  854. item.ResourceUrl = resourceUrl
  855. item.ResourceType = 1
  856. item.CreateTime = time.Now()
  857. newId, err := models.AddResource(item)
  858. if err != nil {
  859. br.Msg = "资源上传失败"
  860. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  861. return
  862. }
  863. resp := new(models.ResourceResp)
  864. resp.Id = newId
  865. resp.ResourceUrl = resourceUrl
  866. br.Msg = "上传成功"
  867. br.Ret = 200
  868. br.Success = true
  869. //br.Data = resp
  870. return
  871. }
  872. // @Title 获取STSToken
  873. // @Description 获取STSToken
  874. // @Success 200 获取成功
  875. // @router /oss/get_sts_token [get]
  876. func (this *ResourceController) OssSTSToken() {
  877. br := new(models.BaseResponse).Init()
  878. defer func() {
  879. this.Data["json"] = br
  880. this.ServeJSON()
  881. }()
  882. ossClient := services.NewOssClient()
  883. if ossClient == nil {
  884. br.Msg = "上传失败"
  885. br.ErrMsg = "初始化OSS服务失败"
  886. return
  887. }
  888. resp, e := ossClient.GetUploadToken()
  889. if e != nil {
  890. br.Msg = "获取失败"
  891. br.ErrMsg = "获取OSS上传Token失败, Err: " + e.Error()
  892. return
  893. }
  894. br.Data = resp
  895. br.Msg = "获取成功"
  896. br.Ret = 200
  897. br.Success = true
  898. //source, _ := this.GetInt("StorageSource")
  899. //
  900. //if source == utils.STORAGESOURCE_OSS {
  901. // resp, err := services.GetOssSTSToken()
  902. // if err != nil {
  903. // br.Msg = "获取失败"
  904. // br.ErrMsg = "获取STSToken失败, Err: " + err.Error()
  905. // return
  906. // }
  907. // br.Data = resp
  908. // br.Msg = "获取成功"
  909. // br.Ret = 200
  910. // br.Success = true
  911. //} else if source == utils.STORAGESOURCE_MINIO {
  912. // resp, err := services.GetMinIOSTSToken()
  913. // if err != nil {
  914. // br.Msg = "获取失败"
  915. // br.ErrMsg = "获取STSToken失败, Err: " + err.Error()
  916. // return
  917. // }
  918. // br.Data = resp
  919. // br.Msg = "获取成功"
  920. // br.Ret = 200
  921. // br.Success = true
  922. //}
  923. }
  924. // FileDownload
  925. // @Title 文件下载
  926. // @Description 文件下载
  927. // @Param FileUrl query string true "文件路径"
  928. // @Success 200 Ret=200 操作成功
  929. // @router /file/download [get]
  930. func (this *ResourceAuthController) FileDownload() {
  931. br := new(models.BaseResponse).Init()
  932. defer func() {
  933. if br.ErrMsg == "" {
  934. br.IsSendEmail = false
  935. }
  936. this.Data["json"] = br
  937. this.ServeJSON()
  938. }()
  939. sysUser := this.SysUser
  940. if sysUser == nil {
  941. br.Msg = "请登录"
  942. br.ErrMsg = "请登录,SysUser Is Empty"
  943. br.Ret = 408
  944. return
  945. }
  946. //fileName := this.GetString("FileName")
  947. //fileName = strings.TrimSpace(fileName)
  948. //if fileName == "" {
  949. // br.Msg = "参数有误"
  950. // return
  951. //}
  952. fileEncode := this.GetString("FileUrl")
  953. fileEncode = strings.TrimSpace(fileEncode)
  954. if fileEncode == "" {
  955. br.Msg = "参数有误"
  956. return
  957. }
  958. fileByte, e := base64.StdEncoding.DecodeString(fileEncode)
  959. if e != nil {
  960. br.Msg = "下载失败"
  961. br.ErrMsg = "文件地址解析失败, Err: " + e.Error()
  962. return
  963. }
  964. fileUrl := string(fileByte)
  965. fileArr := strings.Split(fileUrl, "/")
  966. if len(fileArr) == 0 {
  967. br.Msg = "文件地址有误"
  968. return
  969. }
  970. fileName := fileArr[len(fileArr)-1]
  971. //fmt.Println(fileName)
  972. if utils.MinIoFileDownloadHost != "" {
  973. fmt.Println("fileUrl replace before:" + fileUrl)
  974. fileUrl = strings.Replace(fileUrl, utils.MinIoImghost, utils.MinIoFileDownloadHost, -1)
  975. fmt.Println("fileUrl replace after:" + fileUrl)
  976. }
  977. // 获取文件
  978. down, e := http.Get(fileUrl)
  979. if e != nil {
  980. br.Msg = "下载失败"
  981. br.ErrMsg = "文件下载失败, http get: " + e.Error()
  982. return
  983. }
  984. defer down.Body.Close()
  985. if down.StatusCode != http.StatusOK {
  986. br.Msg = "下载失败"
  987. br.ErrMsg = fmt.Sprintf("文件下载失败, http status: %d", down.StatusCode)
  988. return
  989. }
  990. // 生成本地文件
  991. localFilePath := fmt.Sprintf("%s%s", utils.GetRandStringNoSpecialChar(6), fileName)
  992. localFile, e := os.Create(localFilePath)
  993. if e != nil {
  994. br.Msg = "下载失败"
  995. br.ErrMsg = "生成本地文件失败, Err: " + e.Error()
  996. return
  997. }
  998. defer func() {
  999. if e = localFile.Close(); e != nil {
  1000. fmt.Println("local file close err: ", e.Error())
  1001. }
  1002. if e = os.Remove(localFilePath); e != nil {
  1003. fmt.Println("local file remove err: ", e.Error())
  1004. }
  1005. }()
  1006. // 写入响应流
  1007. //_, e = io.Copy(this.Ctx.ResponseWriter, down.Body)
  1008. _, e = io.Copy(localFile, down.Body)
  1009. if e != nil {
  1010. br.Msg = "下载失败"
  1011. br.ErrMsg = "复制文件资源失败, Err: " + e.Error()
  1012. return
  1013. }
  1014. // 设置响应头
  1015. //this.Ctx.ResponseWriter.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
  1016. //this.Ctx.ResponseWriter.Header().Set("Content-Type", "application/octet-stream")
  1017. br.Ret = 200
  1018. br.Msg = "下载成功"
  1019. br.Success = true
  1020. this.Ctx.Output.Download(localFilePath, fileName)
  1021. }
  1022. // FileUpload
  1023. // @Title 文件上传
  1024. // @Description 文件上传接口
  1025. // @Param file query file true "文件"
  1026. // @Success 200 {object} models.ResourceResp
  1027. // @router /file/upload [post]
  1028. func (this *ResourceController) FileUpload() {
  1029. br := new(models.BaseResponse).Init()
  1030. defer func() {
  1031. this.Data["json"] = br
  1032. this.ServeJSON()
  1033. }()
  1034. f, h, err := this.GetFile("file")
  1035. if err != nil {
  1036. br.Msg = "获取资源信息失败"
  1037. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  1038. return
  1039. }
  1040. uploadFileName := h.Filename //上传的文件名
  1041. ext := path.Ext(h.Filename)
  1042. dateDir := time.Now().Format("20060102")
  1043. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  1044. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  1045. if err != nil {
  1046. br.Msg = "存储目录创建失败"
  1047. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  1048. return
  1049. }
  1050. randStr := utils.GetRandStringNoSpecialChar(28)
  1051. fileName := randStr + ext
  1052. fpath := uploadDir + "/" + fileName
  1053. defer f.Close() //关闭上传文件
  1054. err = this.SaveToFile("file", fpath)
  1055. if err != nil {
  1056. br.Msg = "文件上传失败"
  1057. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  1058. return
  1059. }
  1060. defer func() {
  1061. os.Remove(fpath)
  1062. }()
  1063. resourceUrl := ``
  1064. ossClient := services.NewOssClient()
  1065. if ossClient == nil {
  1066. br.Msg = "上传失败"
  1067. br.ErrMsg = "初始化OSS服务失败"
  1068. return
  1069. }
  1070. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  1071. if err != nil {
  1072. br.Msg = "文件上传失败"
  1073. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  1074. return
  1075. }
  1076. item := new(models.Resource)
  1077. item.ResourceUrl = resourceUrl
  1078. item.ResourceType = 1
  1079. item.CreateTime = time.Now()
  1080. newId, err := models.AddResource(item)
  1081. if err != nil {
  1082. br.Msg = "资源上传失败"
  1083. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  1084. return
  1085. }
  1086. resp := models.ResourceResp{
  1087. Id: newId,
  1088. ResourceUrl: resourceUrl,
  1089. ResourceName: uploadFileName,
  1090. }
  1091. br.Msg = "上传成功"
  1092. br.Ret = 200
  1093. br.Success = true
  1094. br.Data = resp
  1095. return
  1096. }