Create a gist now

Instantly share code, notes, and snippets.

@kenzo0107 /img.go
Last active Aug 30, 2015

What would you like to do?
package controllers
import (
"github.com/flag/app/utility"
"github.com/nfnt/resize"
"github.com/oliamb/cutter"
"github.com/revel/revel"
"image"
"image/gif"
"image/jpeg"
"image/png"
"os"
"strconv"
"strings"
)
type Img struct {
*revel.Controller
}
type ImgUploadApi struct {
ErrorMessage map[string]string
}
/**
* 画像アップロードページ
*/
func (c Img) Index() revel.Result {
return c.Render()
}
/**
* 画像アップロード非同期処理
*/
func (c Img) UploadExecute(imgFile *os.File) revel.Result {
api := ImgUploadApi{}
var errorMessage map[string]string
errorMessage = map[string]string{}
headers, ok := c.Params.Files["imgFile"]
if ok {
if len(headers) != 1 {
errorMessage["imgFile"] = "画像ファイルを選択してください"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
var (
err error
nameSplit []string
suffix string
uploadDaten image.Image
)
// 画像名が xxx.png のような命名か判定
nameSplit = strings.Split(strings.ToLower(headers[0].Filename), ".")
if len(nameSplit) <= 1 {
errorMessage["imgFile"] = "画像はJPEGまはたPNG、GIFを選択してください"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
// suffix(=拡張子)
suffix = nameSplit[len(nameSplit)-1]
switch {
case suffix == "jpg" || suffix == "jpeg":
uploadDaten, err = jpeg.Decode(imgFile)
if err != nil {
revel.ERROR.Println("jpeg デコード処理失敗")
errorMessage["imgFile"] = "ファイルのアップロードに失敗しました"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
case suffix == "png":
uploadDaten, err = png.Decode(imgFile)
if err != nil {
revel.ERROR.Println("png デコード処理失敗")
errorMessage["imgFile"] = "ファイルのアップロードに失敗しました"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
case suffix == "gif":
uploadDaten, err = gif.Decode(imgFile)
if err != nil {
revel.ERROR.Println("gif デコード処理失敗")
errorMessage["imgFile"] = "ファイルのアップロードに失敗しました"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
default:
revel.INFO.Println("jpg, jpeg, png, gif ファイルをご利用ください")
errorMessage["imgFile"] = "画像はJPEGまはたPNG、GIFを選択してください"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
// widthを96pxにリサイズ
resized := resize.Resize(96, 0, uploadDaten, resize.Lanczos3)
// width=96, height=96に切り抜き
thumbnail, _ := cutter.Crop(resized, cutter.Config{
Width: 96,
Height: 96,
Mode: cutter.Centered,
})
prfimg := "prf" + strconv.FormatUint(uInfo.Id, 10) + ".png"
out, _ := os.Create(prfimg)
err = png.Encode(out, thumbnail)
defer out.Close()
if err != nil {
revel.ERROR.Println("png デコード失敗")
errorMessage["imgFile"] = "ファイルのアップロードに失敗しました"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
// S3にアップ (bucket内のパス)
user_profile_image := revel.Config.StringDefault("aws.user_profile_image", "")
targetPath := user_profile_image + "/" + prfimg
isSuccessUpload := utility.S3Upload(prfimg, targetPath)
// アップロード失敗
if !isSuccessUpload {
errorMessage["imgFile"] = "ファイルのアップロードに失敗しました"
api.ErrorMessage = errorMessage
return c.RenderJson(api)
}
if err := os.Remove(prfimg); err != nil {
revel.ERROR.Println(err)
}
// AWS上にアップした画像にアクセス可能なURL.
awsImgUrl := revel.Config.StringDefault("aws.imgurl", "")
prifileImgUrl := "http://" + awsImgUrl + "/" + targetPath
// 出力 : これをDBに登録するなりします。
revel.INFO.Println( prifileImgUrl )
}
c.Validation.Clear()
return c.RenderJson(api)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment