// 复制图片 func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, string) { // 是否已经复制过了 file2 := info.File{} db.GetByQ(db.Files, bson.M{"UserId": bson.ObjectIdHex(toUserId), "FromFileId": bson.ObjectIdHex(fileId)}, &file2) if file2.FileId != "" { return true, file2.FileId.Hex() } // 复制之 file := info.File{} db.GetByIdAndUserId(db.Files, fileId, userId, &file) if file.FileId == "" || file.UserId.Hex() != userId { return false, "" } _, ext := SplitFilename(file.Name) newFilename := NewGuid() + ext dir := "files/" + toUserId + "/images" filePath := dir + "/" + newFilename //modified by JacobXie var err error if qiniuService.IsUseQiniu() { err = qiniuService.CopyOnQiniu(file.Path, filePath) } else { err = os.MkdirAll(dir, 0755) if err != nil { return false, "" } _, err = CopyFile(revel.BasePath+"/"+file.Path, revel.BasePath+"/"+filePath) } if err != nil { Log(err) return false, "" } fileInfo := info.File{Name: newFilename, Title: file.Title, Path: filePath, Size: file.Size, FromFileId: file.FileId} id := bson.NewObjectId() fileInfo.FileId = id fileId = id.Hex() Ok, _ := this.AddImage(fileInfo, "", toUserId, false) if Ok { return Ok, id.Hex() } return false, "" }
// 复制外网的图片 // 都要好好的计算大小 func (c File) CopyHttpImage(src string) revel.Result { re := info.NewRe() // 生成上传路径 newGuid := NewGuid() userId := c.GetUserId() fileUrlPath := "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images" //modified by JacobXie var filesize int64 var filename string var ok bool if qiniuService.IsUseQiniu() { filesize, filename, _, ok = qiniuService.Upload2QiniuWithUrl(src, fileUrlPath) } else { dir := revel.BasePath + "/" + fileUrlPath err := os.MkdirAll(dir, 0755) if err != nil { return c.RenderJson(re) } filesize, filename, _, ok = netutil.WriteUrl(src, dir) } if !ok { re.Msg = "copy error" return c.RenderJson(re) } // File fileInfo := info.File{Name: filename, Title: filename, Path: fileUrlPath + "/" + filename, Size: filesize} id := bson.NewObjectId() fileInfo.FileId = id re.Id = id.Hex() // re.Item = fileInfo.Path re.Ok, re.Msg = fileService.AddImage(fileInfo, "", c.GetUserId(), true) return c.RenderJson(re) }
// 上传图片, 公用方法 // upload image common func func (c File) uploadImage(from, albumId string) (re info.Re) { var fileUrlPath = "" var fileId = "" var resultCode = 0 // 1表示正常 var resultMsg = "error" // 错误信息 var Ok = false defer func() { re.Id = fileId // 只是id, 没有其它信息 re.Code = resultCode re.Msg = resultMsg re.Ok = Ok L("fileID : " + re.Id) L("Msg : " + re.Msg) }() file, handel, err := c.Request.FormFile("file") if err != nil { return re } defer file.Close() // 生成上传路径 newGuid := NewGuid() userId := c.GetUserId() if from == "logo" || from == "blogLogo" { fileUrlPath = "public/upload/" + Digest3(userId) + "/" + userId + "/images/logo" } else { fileUrlPath = "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images" } // 生成新的文件名 filename := handel.Filename var ext string if from == "pasteImage" { ext = ".png" // TODO 可能不是png类型 } else { _, ext = SplitFilename(filename) if ext != ".gif" && ext != ".jpg" && ext != ".png" && ext != ".bmp" && ext != ".jpeg" { resultMsg = "Please upload image" return re } } filename = newGuid + ext //判断文件大小 var maxFileSize float64 if from == "logo" { maxFileSize = configService.GetUploadSize("uploadAvatarSize") } else if from == "blogLogo" { maxFileSize = configService.GetUploadSize("uploadBlogLogoSize") } else { maxFileSize = configService.GetUploadSize("uploadImageSize") } if maxFileSize <= 0 { maxFileSize = 1000 } //filesize = int64(len(data)) //modified by JacobXie var filesize int64 // 获取文件大小的接口 type Sizer interface { Size() int64 } if sizeInterface, ok := file.(Sizer); ok { filesize = sizeInterface.Size() } // > 2M? if float64(filesize) > maxFileSize*float64(1024*1024) { resultCode = 0 resultMsg = fmt.Sprintf("The file Size is bigger than %vM", maxFileSize) return re } //modified by JacobXie if qiniuService.IsUseQiniu() { toPath := fileUrlPath + "/" + filename err := qiniuService.Upload2Qiniu(toPath, file, filesize) if err != nil { LogJ(err) return re } } else { data, err := ioutil.ReadAll(file) if err != nil { LogJ(err) return re } dir := revel.BasePath + "/" + fileUrlPath err = os.MkdirAll(dir, 0755) if err != nil { return re } toPath := dir + "/" + filename err = ioutil.WriteFile(toPath, data, 0777) if err != nil { LogJ(err) return re } // 改变成gif图片 _, toPathGif := TransToGif(toPath, 0, true) filename = GetFilename(toPathGif) filesize = GetFilesize(toPathGif) } fileUrlPath += "/" + filename resultCode = 1 resultMsg = "Upload Success!" // File fileInfo := info.File{Name: filename, Title: handel.Filename, Path: fileUrlPath, Size: filesize} id := bson.NewObjectId() fileInfo.FileId = id fileId = id.Hex() if from == "logo" || from == "blogLogo" { if qiniuService.IsUseQiniu() { fileId = qiniuService.GetUrlOnQiniu(fileUrlPath) } else { fileId = fileUrlPath } } Ok, resultMsg = fileService.AddImage(fileInfo, albumId, c.GetUserId(), from == "" || from == "pasteImage") resultMsg = c.Message(resultMsg) fileInfo.Path = "" // 不要返回 re.Item = fileInfo return re }