package system import ( "context" "fmt" "git.i2edu.net/i2/i2-bill-api/internal/svc" "git.i2edu.net/i2/i2-bill-api/internal/types" "io" "net/http" "os" "path/filepath" "git.i2edu.net/i2/go-zero/core/logx" ) type SystemFileUploadLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewSystemFileUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) SystemFileUploadLogic { return SystemFileUploadLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *SystemFileUploadLogic) SystemFileUpload(r *http.Request) (*types.Response, error) { // todo: add your logic here and delete this line userId := l.svcCtx.GetUserIdByJwt(l.ctx) file, fileHeader, err := r.FormFile("file") if err != nil { logx.Error(err.Error()) return &types.Response{500, err.Error(), nil}, nil } dir := "asserts/avatar" _, err = os.Stat(dir) if err != nil && !os.IsExist(err) { err := os.MkdirAll(dir, os.ModePerm) if err != nil { logx.Error(err.Error()) return &types.Response{500, err.Error(), nil}, nil } } fileName := fmt.Sprintf("%s/%d%s", dir, userId, filepath.Ext(fileHeader.Filename)) newFile, err := os.OpenFile(fileName, os.O_TRUNC|os.O_CREATE|os.O_RDWR, 0777) if err != nil { logx.Error(err.Error()) return &types.Response{500, err.Error(), nil}, nil } _, err = io.Copy(newFile, file) if err != nil { logx.Error(err.Error()) return &types.Response{500, err.Error(), nil}, nil } return &types.Response{200, "", fileName}, nil // //file, fInfo, err := r.FormFile("file") //if err != nil { // logx.Error(err.Error()) // return &types.Response{500, err.Error(), nil}, nil //} //defer file.Close() // //var attach *sysmodel.SysAttachment = nil //if _attachementUpDownloader != nil{ // attach, err = _attachementUpDownloader.Upload(file, fInfo) // if err !=nil{ // return nil, err // } //}else{ // return nil, errors.New("附件上传下载接口为nil") //} // //userId := c.Ctx.GetString("user_id") // //if attach.Id == ""{ // attach.Id = sysutils.NewUUID() //} //if attach.Size <= 0{ // attach.Size = int32((fInfo.Size)) //} //attach.Name = fInfo.Filename //attach.CreateBy = userId //attach.CreateTime = time.Now() //attach.Ext = path.Ext(attach.Name) // //_, err = c.PlatformDbEngine.InsertOne(attach) //if err != nil { // syslogs.Error("保存附件出错了:", err) // return nil, err //} //return attach, nil } /** * @brief: 默认 */ type defaultAttachUpDownloader struct { } /** * @brief: 附件上传接口 * @param1 file: post 多媒体file * @param1 header: 文件相头信息 * @return1: 附件信息,主要包括id,url, hash和大小。其他字段会自动设置 * @return2: 错误信息 */ //func(d *defaultAttachUpDownloader)Upload(file multipart.File, header *multipart.FileHeader)(*sysmodel.SysAttachment, error){ // fileDir := fmt.Sprintf("files/") // if err := mkdir(fileDir); err != nil { // syslogs.Info("文件夹创建失败") // return nil, err // } // attachId := sysutils.NewUUID() // filePath := fileDir + attachId // fW, err := os.Create(filePath) // if err != nil { // syslogs.Info("文件创建失败") // return nil, err // } // defer fW.Close() // length, err := io.Copy(fW, file) // if err != nil { // syslogs.Info("文件保存失败") // return nil, err // } // // attach := &sysmodel.SysAttachment{} // attach.Id = attachId // attach.Url = "/api/v1/sys_attachment/download?id=" + attach.Id // attach.Hash = "" // attach.Size = int32(length) // // return attach, nil //} // ///** // * @brief: 附件下载 // * @param1 ctx: 上下文 // * @param2 id: 附件记录的id // */ //func(d *defaultAttachUpDownloader)Download(c *entitys.CtrlContext, attach *sysmodel.SysAttachment){ // filePath := "files/" + attach.Id // // c.Ctx.Writer.Header().Add("Content-Disposition", "attachment;filename=\""+sysutils.FormatForBrowse(c.Ctx.Request.UserAgent(), attach.Name)+"\"") // c.Ctx.Writer.Header().Add("Content-Type", mime.TypeByExtension(attach.Ext)) // c.Ctx.Writer.Header().Add("Content-Length", strconv.FormatInt(int64(attach.Size), 10)) // c.Ctx.Writer.Header().Add("Accept-Ranges", "bytes") // // if !sysutils.Exists(filePath) { // c.Ctx.Writer.WriteHeader(400) // return // } // fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Disposition")) // fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Type")) // fmt.Println("---->", c.Ctx.Writer.Header().Get("Content-Length")) // fmt.Println("---->", c.Ctx.Writer.Header().Get("Accept-Ranges")) // // c.Ctx.File(filePath) //} //