github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/routers/apis/UploadHandler.go (about)

     1  package apis
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"github.com/insionng/makross"
     7  	"io"
     8  	"log"
     9  	"os"
    10  	"path"
    11  	"strconv"
    12  	"strings"
    13  	"time"
    14  	"github.com/insionng/yougam/helper"
    15  	"github.com/insionng/yougam/models"
    16  )
    17  
    18  func PostUploadHandler(self *makross.Context) error {
    19  
    20  	_usr_, okay := self.Session.Get("SignedUser").(*models.User)
    21  
    22  	TplNames := "editor-ajax-result"
    23  	uid := int64(0)
    24  	if (_usr_ != nil) && okay {
    25  		uid = _usr_.Id
    26  	} else {
    27  		self.Flash.Error("UploadPostHandler获取UID错误0!")
    28  		self.Set("result", "UploadPostHandler获取UID错误0!")
    29  		self.Set("resultcode", "failed")
    30  		return self.Render(TplNames)
    31  
    32  	}
    33  
    34  	file, e := self.FormFile("uploadfile")
    35  	if e != nil {
    36  		self.Flash.Error("UploadPostHandler获取文件错误1!")
    37  		self.Set("result", "UploadPostHandler() self.GetFile() Errors")
    38  		self.Set("resultcode", "failed")
    39  		return self.Render(TplNames)
    40  
    41  	}
    42  
    43  	targetFolder := helper.FileStorageDir + "file"
    44  
    45  	if file.Filename == "" {
    46  
    47  		self.Flash.Error("UploadPostHandler获取文件错误3!")
    48  
    49  		self.Set("result", " ")
    50  		self.Set("resultcode", "failed")
    51  		return self.Render(TplNames)
    52  
    53  	}
    54  
    55  	ext := strings.ToLower(path.Ext(file.Filename))
    56  	filename := helper.MD5(time.Now().String()) + ext
    57  	dirpath := fmt.Sprintf("%v/%v", targetFolder, fmt.Sprintf("%v/%v", uid, time.Now().Format("03/04/")))
    58  
    59  	_err := os.MkdirAll(dirpath, 0755)
    60  	if _err != nil {
    61  		self.Flash.Error(_err.Error())
    62  
    63  		self.Set("result", " ")
    64  		self.Set("resultcode", "failed")
    65  		return self.Render(TplNames)
    66  	}
    67  
    68  	path := dirpath + filename
    69  	f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0755)
    70  	if err != nil {
    71  
    72  		self.Flash.Error("UploadPostHandler获取文件错误2!")
    73  
    74  		self.Set("result", " ")
    75  		self.Set("resultcode", "failed")
    76  		return self.Render(TplNames)
    77  
    78  	}
    79  	defer f.Close()
    80  
    81  	src, err := file.Open()
    82  	if err != nil {
    83  		self.Set("result", err)
    84  		self.Set("resultcode", "failed")
    85  		return self.Render(TplNames)
    86  
    87  	}
    88  	defer src.Close()
    89  
    90  	// Copy
    91  	if _, err = io.Copy(f, src); err != nil {
    92  		self.Set("result", err)
    93  		self.Set("resultcode", "failed")
    94  		return self.Render(TplNames)
    95  
    96  	}
    97  
    98  	input_file := path
    99  	output_file := fmt.Sprintf("%s%v-%s", dirpath, uid, filename)
   100  	output_size := "768x0"
   101  	output_align := "center"
   102  	background := "white"
   103  	staticPath := "./themes/" + helper.Theme() + "/static"
   104  	watermark_file := staticPath + "/img/watermark.png"
   105  
   106  	//所有上传的图片都会被缩略处理
   107  	err = helper.Thumbnail("resize", input_file, output_file, output_size, output_align, background)
   108  	if err != nil {
   109  
   110  		self.Flash.Error(fmt.Sprintf("UploadPostHandler生成缩略图出错:%v", err))
   111  
   112  		if e := os.Remove(helper.URL2local(input_file)); e != nil {
   113  			os.Remove(helper.URL2local(output_file))
   114  			self.Flash.Error(fmt.Sprintf("UploadPostHandler生成缩略图出错:%v", e))
   115  		}
   116  
   117  		self.Set("result", err)
   118  		self.Set("resultcode", "failed")
   119  		return self.Render(TplNames)
   120  
   121  	} else {
   122  
   123  		os.Remove(helper.URL2local(input_file))
   124  
   125  		helper.Watermark(watermark_file, output_file, output_file, "SouthEast")
   126  
   127  		filehash, _ := helper.Filehash(helper.URL2local(output_file), nil)
   128  		fname := helper.EncryptHash(filehash+strconv.Itoa(int(uid)), nil)
   129  		newpath := dirpath + fname + ext
   130  
   131  		if err := os.Rename(helper.URL2local(output_file), helper.URL2local(newpath)); err != nil {
   132  			log.Println("重命名文件发生错误:", err)
   133  		} else {
   134  			os.Remove(helper.URL2local(output_file))
   135  		}
   136  
   137  		//文件权限校验 通过说明文件上传转换过程中没发生错误
   138  		//首先读取被操作文件的hash值 和 用户请求中的文件hash值  以及 用户当前id的string类型  进行验证
   139  
   140  		if fhashed, _ := helper.Filehash(helper.URL2local(newpath), nil); helper.ValidateHash(fname, fhashed+strconv.Itoa(int(uid))) {
   141  
   142  			self.Set("result", "file_uploaded")
   143  			self.Set("resultcode", "ok")
   144  			self.Set("file_name", newpath[6:])
   145  			return self.Render(TplNames)
   146  
   147  		} else {
   148  
   149  			self.Flash.Error("UploadPostHandler校验图片不正确!")
   150  
   151  			self.Set("result", " ")
   152  			self.Set("resultcode", "failed")
   153  
   154  			if e := os.Remove(helper.URL2local(newpath)); e != nil {
   155  				self.Flash.Error(fmt.Sprintf("UploadPostHandler清除错误文件 %v 出错:%v", newpath, e))
   156  			}
   157  		}
   158  
   159  	}
   160  
   161  	return errors.New("UploadPostHandler Errors")
   162  
   163  }