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 }