Go iris 上传文件 + CKEditor 图片上传实践

最近将网站的富文本编辑器从 Vue-html5-editor 切换到 CKEditor,于是图片上传接口也跟着修改,本着一不做二不休的原则,那就索性把上传接口也一并优化,一个网站最好仅仅提供一个上传的接口。本网站基于 go iris 框架开发,所以上传接口也是基于 go iris 框架。结合富文本编辑器 CKEditor,以及其他上传场景,统一使用一个上传接口。
 

上传表单


file, info, err := ctx.FormFile("upload")

// go iris 框架对文件上传已经做了很好的封装
// CKEditor,上传表单用的 name="upload"
// 于是将网站文章小图片上传的表单也做相应修改,这样就可以共用一个上传接口
 

文件命名


go get github.com/google/uuid

// 这个包即插即用,没有任何初始化
// 这里导入 google 的官方的 uuid 包,使用全局唯一的 uuid,生成文件名:89073e52-6494-4d2a-9b66-c12e187f124c.jpg
 

日志记录


go get github.com/kataras/golog

// 这个包简单易用,我有一篇文章专门介绍过,即插即用,https://www.hrefs.cn/article/golog-and-juju-errors-quickstart
 

支持CKEditor图片上传


result := struct {
   Message  string `json:"msg"`
   Uploaded int    `json:"uploaded"`
   Url      string `json:"url"`
}{"", 0, ""}

// CKEditor图片上传组件接收一个json,必须包含两个字段,uploaded=1 表示上传成功,url 表示上传成功后的返回的地址
// {uploaded: 1, url: "/upload/20200221/89073e52-6494-4d2a-9b66-c12e187f124c.jpg"}
 

go iris 上传源码


package controller

import (
   "github.com/google/uuid"
   "github.com/kataras/golog"
   "github.com/kataras/iris"
   "io"
   "os"
   "path"
   "strings"
   "time"
)

func Upload(ctx iris.Context) {
   result := struct {
      Message  string `json:"msg"`
      Uploaded int    `json:"uploaded"`
      Url      string `json:"url"`
   }{"", 0, ""}

   file, info, err := ctx.FormFile("upload")
   if err != nil {
      golog.Error(err)
      ctx.JSON(result)
   }

   dir := "/upload/" + time.Now().Format("20060102") + "/"
   err = os.MkdirAll("./public"+dir, os.ModePerm)
   if err != nil {
      golog.Error(err)
      ctx.JSON(result)
   }

   url := dir + uuid.New().String() + strings.ToLower(path.Ext(info.Filename))
   out, err := os.OpenFile("./public/"+url, os.O_WRONLY|os.O_CREATE, 0666)
   if err != nil {
      golog.Error(err)
      ctx.JSON(result)
   }

   defer file.Close()
   defer out.Close()
   io.Copy(out, file)

   result.Uploaded = 1
   result.Url = url
   ctx.JSON(result)
}
// 上传接口的 response

{
    "msg":"",
    "uploaded":1,
    "url":"/upload/20200221/8617b336-6128-4fef-920e-f29ef8c49bc7.jpg"
}
Posted by 何敏 on 2020-02-21 09:12:06