123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- package controllers
-
- import (
- "bytes"
- "errors"
- "spaceofcheng/services/utils"
- "strconv"
- "time"
-
- "net/http"
- "net/url"
- )
-
- // FileUpload 文件上传
- func (c *BaseController) FileUpload() {
- file, err := c.uploadFileToOSS("file")
- if err != nil {
- c.ResponseError(err, http.StatusInternalServerError)
- }
-
- c.ResponseJSON(map[string]interface{}{
- "url": file,
- })
- }
-
- func (c *BaseController) uploadFileToOSS(field string) (string, error) {
- aliConf, ok := c.Configer[AliYunConf]
- if !ok {
- return "", errors.New("没有找到阿里云相关配置")
- }
-
- endpoint := aliConf.String("oss::Endpoint")
- accessKeyID := aliConf.String("oss::AccessKeyId")
- accessKeySecret := aliConf.String("oss::AccessKeySecret")
- bucket := aliConf.String("oss::Bucket")
-
- aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
- if err != nil {
- return "", err
- }
-
- fNameExtra := strconv.FormatInt(time.Now().Unix(), 10)
-
- fileURL, err := utils.UploadFileToBucket(aliCli, c.Ctx.Request, bucket, field, fNameExtra)
- if err != nil {
- return "", err
- }
-
- return fileURL, nil
- }
-
- // SaveToExcel 保存文件到 excel
- // 文件不落地, 对内存开销比较大, 如果文件过大, 服务可能会崩掉
- func (c *BaseController) SaveToExcel(fn string, excel *utils.TinyXLSXEngine) {
- var buf bytes.Buffer
- if err := excel.Write(&buf); err != nil {
- utils.LogError("写 xlsx buffer 失败: " + err.Error())
- c.ResponseError(errors.New("生成 excel 异常, 请重试"))
- }
-
- c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(fn))
- c.Ctx.Output.Header("Content-Description", "File Transfer")
- c.Ctx.Output.ContentType(".xlsx")
- c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
- c.Ctx.Output.Header("Expires", "0")
- c.Ctx.Output.Header("Cache-Control", "must-revalidate")
- c.Ctx.Output.Header("Pragma", "public")
-
- r := bytes.NewReader(buf.Bytes())
- http.ServeContent(c.Ctx.ResponseWriter, c.Ctx.Request, fn, time.Now().Local(), r)
-
- c.destroyContext(true)
- c.StopRun()
- }
-
- // UploadBase64Image Upload base64-image to ali-oss
- // @Title Upload image to ali-oss
- // @Description 上传base64图片到阿里云
- // @Param UpImgStr form string true "图片控件name"
- // @Success 200 { Url } 图片URL
- // @Failure >300 error message
- func (c *BaseController) UploadBase64Image() {
- base64Str, err := url.QueryUnescape(c.GetString("base64str"))
- if err != nil {
- c.ResponseError(utils.LogError("上传 Base64 图片失败", err))
- }
-
- imgURL, err := c.uploadStringToAliOSS(base64Str)
- if err != nil {
- c.ResponseError(err)
- }
-
- resp := map[string]interface{}{
- "url": imgURL,
- }
-
- c.ResponseJSON(resp)
- }
-
- // func (c *BaseController) UploadBase64ImageGzip() {
- // base64Gzip := c.GetString("base64str")
- // baseZip := []byte(base64Gzip)
- // reader, err := gzip.NewReader(bytes.NewReader(baseZip))
- // if err != nil {
- // c.ResponseError(err)
- // }
- // baseByte, err := ioutil.ReadAll(reader)
- // baseStr := string(baseByte)
- // base64Str, err := url.QueryUnescape(baseStr)
- // if err != nil {
- // c.ResponseError(utils.LogError("上传 Base64 图片失败", err))
- // }
-
- // imgURL, err := c.uploadStringToAliOSS(base64Str)
- // if err != nil {
- // c.ResponseError(err)
- // }
-
- // resp := map[string]interface{}{
- // "url": imgURL,
- // }
-
- // c.ResponseJSON(resp)
- // }
-
- // uploadStringToAliOSS 上传文件到阿里云
- func (c *BaseController) uploadStringToAliOSS(fStr string) (string, error) {
- aliConf, ok := c.Configer[AliYunConf]
- if !ok {
- return "", errors.New("没有找到阿里云相关配置")
- }
-
- endpoint := aliConf.String("oss::Endpoint")
- accessKeyID := aliConf.String("oss::AccessKeyId")
- accessKeySecret := aliConf.String("oss::AccessKeySecret")
- bucket := aliConf.String("oss::Bucket")
-
- aliCli, err := utils.GetOssClient(endpoint, accessKeyID, accessKeySecret)
- if err != nil {
- return "", utils.LogError("配置阿里云客户端失败", err)
- }
-
- fileURL, err := utils.UploadStringToBucket(aliCli, bucket, fStr)
- if err != nil {
- return "", utils.LogError("上传文件到阿里云失败", err)
- }
-
- return fileURL, nil
- }
-
- // SaveNetFilesToZip 压缩远程文件并下载
- func (c *BaseController) SaveNetFilesToZip(files []utils.NetFile, zf string) {
- var buf bytes.Buffer
-
- err := utils.ZipNetFiles(files, &buf)
- if err != nil {
- c.ResponseError(errors.New("下载 zip 文件失败"))
- }
-
- c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(zf))
- c.Ctx.Output.Header("Content-Description", "File Transfer")
- c.Ctx.Output.ContentType("application/zip")
- c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
- c.Ctx.Output.Header("Expires", "0")
- c.Ctx.Output.Header("Cache-Control", "must-revalidate")
- c.Ctx.Output.Header("Pragma", "public")
-
- r := bytes.NewReader(buf.Bytes())
- http.ServeContent(c.Ctx.ResponseWriter, c.Ctx.Request, zf, time.Now().Local(), r)
-
- c.destroyContext(true)
- c.StopRun()
-
- }
|