|
@@ -1,6 +1,7 @@
|
|
|
package material
|
|
|
|
|
|
import (
|
|
|
+ "archive/zip"
|
|
|
"encoding/json"
|
|
|
"eta/eta_api/controllers"
|
|
|
"eta/eta_api/models"
|
|
@@ -10,8 +11,10 @@ import (
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
"github.com/h2non/filetype"
|
|
|
+ "github.com/rdlucklib/rdluck_tools/http"
|
|
|
"github.com/rdlucklib/rdluck_tools/paging"
|
|
|
"io/ioutil"
|
|
|
+ "os"
|
|
|
"path"
|
|
|
"strconv"
|
|
|
"strings"
|
|
@@ -130,11 +133,17 @@ func (this *MaterialController) AddMaterialClassify() {
|
|
|
level = parentClassify.Level + 1
|
|
|
levelPath = parentClassify.LevelPath
|
|
|
}
|
|
|
+ var count int
|
|
|
+ switch this.Lang {
|
|
|
+ case utils.LANG_EN:
|
|
|
+ count, err = material.GetMaterialClassifyNameEnCount(req.ClassifyName, req.ParentId)
|
|
|
+ default:
|
|
|
+ count, err = material.GetMaterialClassifyNameCount(req.ClassifyName, req.ParentId)
|
|
|
+ }
|
|
|
|
|
|
- count, e := material.GetMaterialClassifyNameCount(req.ClassifyName, req.ParentId)
|
|
|
- if e != nil {
|
|
|
+ if err != nil {
|
|
|
br.Msg = "判断名称是否已存在失败"
|
|
|
- br.ErrMsg = "判断名称是否已存在失败,Err:" + e.Error()
|
|
|
+ br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
if count > 0 {
|
|
@@ -148,6 +157,7 @@ func (this *MaterialController) AddMaterialClassify() {
|
|
|
maxSort, _ := material.GetMaterialClassifyMaxSort(req.ParentId)
|
|
|
classify.ParentId = req.ParentId
|
|
|
classify.ClassifyName = req.ClassifyName
|
|
|
+ classify.ClassifyNameEn = req.ClassifyName
|
|
|
classify.CreateTime = time.Now()
|
|
|
classify.ModifyTime = time.Now()
|
|
|
classify.SysUserId = this.SysUser.AdminId
|
|
@@ -221,7 +231,19 @@ func (this *MaterialController) EditMaterialClassify() {
|
|
|
br.Msg = "获取分类信息失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- count, err := material.GetMaterialClassifyNameNotSelfCount(req.ClassifyId, req.ClassifyName, item.ParentId)
|
|
|
+ var count int
|
|
|
+ updateStr := make([]string, 0)
|
|
|
+ switch this.Lang {
|
|
|
+ case utils.LANG_EN:
|
|
|
+ count, err = material.GetMaterialClassifyNameEnNotSelfCount(req.ClassifyId, req.ClassifyName, item.ParentId)
|
|
|
+ item.ClassifyNameEn = req.ClassifyName
|
|
|
+ updateStr = append(updateStr, "ClassifyNameEn")
|
|
|
+ default:
|
|
|
+ count, err = material.GetMaterialClassifyNameNotSelfCount(req.ClassifyId, req.ClassifyName, item.ParentId)
|
|
|
+ item.ClassifyName = req.ClassifyName
|
|
|
+ updateStr = append(updateStr, "ClassifyName")
|
|
|
+ }
|
|
|
+
|
|
|
if err != nil {
|
|
|
br.Msg = "判断名称是否已存在失败"
|
|
|
br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
|
|
@@ -232,13 +254,10 @@ func (this *MaterialController) EditMaterialClassify() {
|
|
|
br.IsSendEmail = false
|
|
|
return
|
|
|
}
|
|
|
- //levelPath = fmt.Sprintf("%s,%d", levelPath, req.ClassifyId)
|
|
|
- //item.LevelPath = levelPath
|
|
|
- //item.ParentId = req.ParentId
|
|
|
- item.ClassifyName = req.ClassifyName
|
|
|
+
|
|
|
item.ModifyTime = time.Now()
|
|
|
- //e = item.Update([]string{"LevelPath", "ParentId", "ClassifyName", "ModifyTime"})
|
|
|
- err = item.Update([]string{"ClassifyName", "ModifyTime"})
|
|
|
+ updateStr = append(updateStr, "ModifyTime")
|
|
|
+ err = item.Update(updateStr)
|
|
|
if err != nil {
|
|
|
br.Msg = "保存分类失败"
|
|
|
br.ErrMsg = "保存分类失败,Err:" + err.Error()
|
|
@@ -1176,108 +1195,40 @@ func (this *MaterialController) BatchAdd() {
|
|
|
br.Msg = "请填写图片名称"
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- // 判断文件名是否已存在
|
|
|
- exist, e := material.GetMaterialByNames(materialNames)
|
|
|
- if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
- br.Msg = "获取失败"
|
|
|
- br.ErrMsg = "获取数据失败,Err:" + err.Error()
|
|
|
- return
|
|
|
- }
|
|
|
- if e == nil && exist.MaterialId > 0 {
|
|
|
- br.Msg = fmt.Sprintf("图片名称:%s 已存在", exist.MaterialName)
|
|
|
- return
|
|
|
- }
|
|
|
- // 获取表单中的所有文件
|
|
|
- /*files, err := this.GetFiles("Files")
|
|
|
- if err != nil {
|
|
|
- br.Msg = "文件上传失败"
|
|
|
- br.ErrMsg = "文件上传失败,Err:" + err.Error()
|
|
|
- return
|
|
|
- }
|
|
|
- if len(files) == 0 {
|
|
|
- br.Msg = "请选择文件"
|
|
|
- return
|
|
|
- }
|
|
|
- if len(materialNames) != len(files) {
|
|
|
- br.Msg = "图片数量与名称数量不一致"
|
|
|
- return
|
|
|
- }
|
|
|
- // 创建目标目录(如果不存在)
|
|
|
- uploadDir := utils.STATIC_DIR + "hongze/" + time.Now().Format("20060102")
|
|
|
- if err = os.MkdirAll(uploadDir, utils.DIR_MOD); err != nil {
|
|
|
- br.Msg = "存储目录创建失败"
|
|
|
- br.ErrMsg = "存储目录创建失败, Err:" + err.Error()
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 处理单个文件(这里假设files是一个多文件字段)
|
|
|
- // 实际上,当使用<input type="file" name="files" multiple>时,
|
|
|
- // 它会作为多个文件字段发送到服务器,名字相同但后缀不同,例如:files, files[1], files[2]等。
|
|
|
- // 所以我们需要遍历这些字段。
|
|
|
-
|
|
|
- // 创建一个map来存储所有文件
|
|
|
- fileUrlMap := make(map[string]string)
|
|
|
-
|
|
|
- // 获取上传文件的头部信息
|
|
|
- //fileHeaders := this.Ctx.Request.Header["Content-Disposition"]
|
|
|
- for k, fileHeader := range files {
|
|
|
- // 解析Content-Disposition头以获取文件名
|
|
|
- // 获取文件名(避免路径遍历攻击,只使用文件名部分)
|
|
|
- fileName := filepath.Base(fileHeader.Filename)
|
|
|
- fileName = strings.TrimSpace(strings.Replace(fileName, "\\", "/", -1)) // 替换可能存在的反斜杠
|
|
|
- fileName = strings.Trim(fileName, " \"\n\r\t") // 去除文件名两侧的空白字符和引号
|
|
|
-
|
|
|
- ext := path.Ext(fileName)
|
|
|
- ossFileName := utils.GetRandStringNoSpecialChar(28) + ext
|
|
|
- filePath := filepath.Join(uploadDir, ossFileName)
|
|
|
-
|
|
|
- // 创建目标文件
|
|
|
- dst, e := os.Create(filePath)
|
|
|
- if e != nil {
|
|
|
- br.Msg = "文件创建失败"
|
|
|
- br.ErrMsg = "文件创建失败, Err:" + e.Error()
|
|
|
- //http.Error(w, e.Error(), http.StatusInternalServerError)
|
|
|
- return
|
|
|
- }
|
|
|
- defer dst.Close()
|
|
|
- src, e := fileHeader.Open()
|
|
|
- if e != nil {
|
|
|
- br.Msg = "文件打开失败"
|
|
|
- br.ErrMsg = "文件打开失败, Err:" + e.Error()
|
|
|
+ existList := make([]*material.Material, 0)
|
|
|
+ switch this.Lang {
|
|
|
+ case utils.LANG_EN:
|
|
|
+ existList, err = material.GetMaterialByNameEns(materialNames)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = "获取数据失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- // 将上传的文件内容复制到目标文件
|
|
|
- if _, err = io.Copy(dst, src); err != nil {
|
|
|
- br.Msg = "文件保存失败"
|
|
|
- br.ErrMsg = "文件保存失败, Err:" + err.Error()
|
|
|
+ if len(existList) > 0 {
|
|
|
+ msg := "图片名称:"
|
|
|
+ for _, v := range existList {
|
|
|
+ msg += v.MaterialNameEn + " "
|
|
|
+ }
|
|
|
+ br.Msg = fmt.Sprintf("%s 已存在", msg)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- defer func() {
|
|
|
- _ = os.Remove(filePath)
|
|
|
- }()
|
|
|
- // 上传到阿里云
|
|
|
- ossDir := utils.RESOURCE_DIR + "cloud_disk/"
|
|
|
-
|
|
|
- savePath := ossDir + time.Now().Format("200601/20060102/") + ossFileName
|
|
|
- ossClient := services.NewOssClient()
|
|
|
- if ossClient == nil {
|
|
|
- br.Msg = "上传失败"
|
|
|
- br.ErrMsg = "初始化OSS服务失败"
|
|
|
+ default:
|
|
|
+ // 判断文件名是否已存在
|
|
|
+ existList, err = material.GetMaterialByNames(materialNames)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = "获取数据失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- resourceUrl, e := ossClient.UploadFile(ossFileName, filePath, savePath)
|
|
|
- if e != nil {
|
|
|
- br.Msg = "文件上传失败"
|
|
|
- br.ErrMsg = "文件上传失败,Err:" + e.Error()
|
|
|
+ if len(existList) > 0 {
|
|
|
+ msg := "图片名称:"
|
|
|
+ for _, v := range existList {
|
|
|
+ msg += v.MaterialName + " "
|
|
|
+ }
|
|
|
+ br.Msg = fmt.Sprintf("%s 已存在", msg)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- // 将文件保存到map中(这里主要是为了演示,实际使用中可能不需要)
|
|
|
- fileUrlMap[materialNames[k]] = resourceUrl
|
|
|
- }*/
|
|
|
-
|
|
|
+ }
|
|
|
err = materialService.BatchAddMaterial(req.MaterialList, classifyId, sysUser.AdminId, sysUser.AdminName)
|
|
|
if err != nil {
|
|
|
br.Msg = "文件上传失败"
|
|
@@ -1339,7 +1290,7 @@ func (this *MaterialController) Upload() {
|
|
|
ossDir := utils.RESOURCE_DIR + "material_dir/"
|
|
|
savePath := ossDir + time.Now().Format("200601/20060102/") + fileName
|
|
|
// 上传文件
|
|
|
- resourceUrl, err := services.CommonUploadToOssAndFileName(f, fileName, savePath)
|
|
|
+ resourceUrl, err := services.CommonUploadToOssAndFileName(h, fileName, savePath)
|
|
|
if err != nil {
|
|
|
br.Msg = "文件上传失败"
|
|
|
br.ErrMsg = "文件上传失败,Err:" + err.Error()
|
|
@@ -1568,28 +1519,41 @@ func (this *MaterialController) Rename() {
|
|
|
br.ErrMsg = "获取素材库信息失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- // 判断名称是否重复
|
|
|
- if info.MaterialName == req.MaterialName {
|
|
|
- br.Msg = "名称未修改"
|
|
|
- return
|
|
|
+ var exist *material.Material
|
|
|
+ updateStr := make([]string, 0)
|
|
|
+ switch this.Lang {
|
|
|
+ case utils.LANG_EN:
|
|
|
+ // 判断名称是否重复
|
|
|
+ if info.MaterialNameEn == req.MaterialName {
|
|
|
+ br.Msg = "名称未修改"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ exist, err = material.GetMaterialByNameEn(req.MaterialName)
|
|
|
+ info.MaterialNameEn = req.MaterialName
|
|
|
+ updateStr = append(updateStr, "MaterialNameEn")
|
|
|
+ default:
|
|
|
+ // 判断名称是否重复
|
|
|
+ if info.MaterialName == req.MaterialName {
|
|
|
+ br.Msg = "名称未修改"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ exist, err = material.GetMaterialByName(req.MaterialName)
|
|
|
+ info.MaterialName = req.MaterialName
|
|
|
+ updateStr = append(updateStr, "MaterialName")
|
|
|
}
|
|
|
-
|
|
|
- // 查询名称是否已存在
|
|
|
- exist, e := material.GetMaterialByNames([]string{req.MaterialName})
|
|
|
- if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ if err != nil && err.Error() != utils.ErrNoRow() {
|
|
|
br.Msg = "获取失败"
|
|
|
br.ErrMsg = "获取数据失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- if e == nil && exist.MaterialId > 0 {
|
|
|
+ if err == nil && exist.MaterialId > 0 {
|
|
|
br.Msg = "图片名称已存在"
|
|
|
return
|
|
|
}
|
|
|
- info.MaterialName = req.MaterialName
|
|
|
info.ModifyTime = time.Now()
|
|
|
-
|
|
|
+ updateStr = append(updateStr, "ModifyTime")
|
|
|
//更换分类素材库
|
|
|
- err = info.Update([]string{"MaterialName", "ModifyTime"})
|
|
|
+ err = info.Update(updateStr)
|
|
|
if err != nil {
|
|
|
br.Msg = err.Error()
|
|
|
return
|
|
@@ -1600,3 +1564,245 @@ func (this *MaterialController) Rename() {
|
|
|
br.Success = true
|
|
|
br.Msg = msg
|
|
|
}
|
|
|
+
|
|
|
+// BatchDownload
|
|
|
+// @Title 批量下载素材
|
|
|
+// @Description 批量下载素材
|
|
|
+// @Param request body material.DeleteSandbox true "type json string"
|
|
|
+// @Success 200 标记成功
|
|
|
+// @router /batch/download [post]
|
|
|
+func (this *MaterialController) BatchDownload() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req material.BatchDeleteMaterialReq
|
|
|
+ err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "参数解析异常!"
|
|
|
+ br.ErrMsg = "参数解析失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ downMaterialList := make([]*material.MaterialListItems, 0)
|
|
|
+ if req.IsSelectAll {
|
|
|
+ classifyId := req.ClassifyId
|
|
|
+ keyword := req.Keyword
|
|
|
+ isShowMe := req.IsShowMe
|
|
|
+ //获取图表信息
|
|
|
+ list, e, msg := materialService.GetBatchSelectedMaterialList(classifyId, keyword, isShowMe, sysUser)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "获取素材库信息失败"
|
|
|
+ if msg != "" {
|
|
|
+ br.Msg = msg
|
|
|
+ }
|
|
|
+ br.ErrMsg = "获取素材库信息失败,Err:" + e.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ notSelectIds := make(map[int]struct{})
|
|
|
+ if len(req.MaterialIds) >= 0 {
|
|
|
+ for _, v := range req.MaterialIds {
|
|
|
+ notSelectIds[v] = struct{}{}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, v := range list {
|
|
|
+ if _, ok := notSelectIds[v.MaterialId]; !ok {
|
|
|
+ downMaterialList = append(downMaterialList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if len(req.MaterialIds) > 0 {
|
|
|
+ // 批量查询指标数据
|
|
|
+ downMaterialList, err = material.GetMaterialByIds(req.MaterialIds)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取素材库信息失败"
|
|
|
+ br.ErrMsg = "获取素材库信息失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(downMaterialList) <= 0 {
|
|
|
+ br.Msg = "请选择要下载的素材"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 创建zip
|
|
|
+ zipName := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".zip"
|
|
|
+ savePath := zipName
|
|
|
+ zipFile, err := os.Create(zipName)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "生成压缩文件失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ zipWriter := zip.NewWriter(zipFile)
|
|
|
+ // 生成zip过程中报错关闭
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ _ = zipWriter.Close()
|
|
|
+ _ = zipFile.Close()
|
|
|
+ }
|
|
|
+ _ = os.Remove(savePath)
|
|
|
+ }()
|
|
|
+
|
|
|
+ // 获取资源, 写入zip
|
|
|
+ zipFileName := ""
|
|
|
+ for i := range downMaterialList {
|
|
|
+ if downMaterialList[i].MaterialName == "" || downMaterialList[i].ImgUrl == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ fmt.Printf("开始压缩第%d个文件\n", i+1)
|
|
|
+ dotIndex := strings.LastIndex(downMaterialList[i].ImgUrl, ".")
|
|
|
+
|
|
|
+ // 如果找不到点,或者点是文件名的第一个字符(不合法情况),则返回空字符串
|
|
|
+ if dotIndex == -1 || dotIndex == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ fileExt := downMaterialList[i].ImgUrl[dotIndex+1:]
|
|
|
+ ioWriter, err := zipWriter.Create(fmt.Sprintf("%s.%s", downMaterialList[i].MaterialName, fileExt))
|
|
|
+ if err != nil {
|
|
|
+ if os.IsPermission(err) {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "打包权限不足, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "压缩出错, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var content []byte
|
|
|
+ content, err = http.Get(downMaterialList[i].ImgUrl)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "资源获取失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _, err = ioWriter.Write(content)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "压缩文件写入失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if zipFileName == "" {
|
|
|
+ zipFileName = downMaterialList[i].MaterialName
|
|
|
+ }
|
|
|
+ fmt.Printf("第%d个文件写入成功\n", i+1)
|
|
|
+ }
|
|
|
+ // 生成zip后关闭,否则下载文件会损坏
|
|
|
+ _ = zipWriter.Close()
|
|
|
+ _ = zipFile.Close()
|
|
|
+
|
|
|
+ this.Ctx.Output.Download(savePath, fmt.Sprintf("%s.zip", zipFileName))
|
|
|
+
|
|
|
+ msg := "操作成功"
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = msg
|
|
|
+}
|
|
|
+
|
|
|
+// Download
|
|
|
+// @Title 下载素材
|
|
|
+// @Description 下载素材
|
|
|
+// @Param request body material.DeleteSandbox true "type json string"
|
|
|
+// @Success 200 标记成功
|
|
|
+// @router /download [post]
|
|
|
+func (this *MaterialController) Download() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req material.RenameMaterialReq
|
|
|
+ err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "参数解析异常!"
|
|
|
+ br.ErrMsg = "参数解析失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if req.MaterialId <= 0 {
|
|
|
+ br.Msg = "缺少素材库编号"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 判断素材是否存在
|
|
|
+ info, err := material.GetMaterialById(req.MaterialId)
|
|
|
+ if err != nil {
|
|
|
+ if err.Error() == utils.ErrNoRow() {
|
|
|
+ br.Msg = "素材不存在"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "获取素材库信息失败"
|
|
|
+ br.ErrMsg = "获取素材库信息失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if info.ImgUrl == "" {
|
|
|
+ br.Msg = "素材地址为空"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fileName := info.MaterialName
|
|
|
+ // 查找文件名中最后一个点的位置
|
|
|
+ dotIndex := strings.LastIndex(info.ImgUrl, ".")
|
|
|
+
|
|
|
+ // 如果找不到点,或者点是文件名的第一个字符(不合法情况),则返回空字符串
|
|
|
+ if dotIndex == -1 || dotIndex == 0 {
|
|
|
+ br.Msg = "素材地址错误"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fileName += "." + info.ImgUrl[dotIndex+1:] // 添加扩展名到文件名
|
|
|
+ // 获取路径中的文件名
|
|
|
+ urlFileName := path.Base(info.ImgUrl)
|
|
|
+ uploadDir := utils.STATIC_DIR + "hongze/" + time.Now().Format("20060102")
|
|
|
+ if e := os.MkdirAll(uploadDir, utils.DIR_MOD); e != nil {
|
|
|
+ br.Msg = "存储目录创建失败"
|
|
|
+ br.ErrMsg = "存储目录创建失败, Err:" + e.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var content []byte
|
|
|
+ content, err = http.Get(info.ImgUrl)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "资源获取失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ filePath := uploadDir + "/" + urlFileName
|
|
|
+ ioWriter, err := os.Create(filePath)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "文件创建失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ n, err := ioWriter.Write(content)
|
|
|
+ fmt.Println("n", n)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = "压缩文件写入失败, Err: " + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.Ctx.Output.Download(filePath, fileName)
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ _ = os.Remove(filePath)
|
|
|
+ }()
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "success"
|
|
|
+}
|