forked from ungerik/go-start
/
imageupload.go
106 lines (98 loc) · 3.06 KB
/
imageupload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package media
import (
"fmt"
"io"
// "github.com/ungerik/go-start/debug"
"github.com/ungerik/go-start/config"
"github.com/ungerik/go-start/view"
)
var UploadImage = view.NewViewURLWrapper(view.RenderViewBindURLArgs(
func(ctx *view.Context, thumbnailSize int) error {
formatError := func(err error) error {
config.Logger.Println("UploadImage:", err)
return fmt.Errorf(`{success: false, error: "%s"}`, err.Error())
}
filename := ctx.Request.Header.Get("X-File-Name")
var r io.ReadCloser
if filename != "" {
r = ctx.Request.Body
} else {
f, h, err := ctx.Request.FormFile("qqfile")
if err != nil {
return formatError(err)
}
filename = h.Filename
r = f
}
defer r.Close()
// debug.Print("UploadImage", filename, thumbnailSize)
i, err := NewImageFromReader(filename, r)
if err != nil {
return formatError(err)
}
v, err := i.Thumbnail(thumbnailSize)
if err != nil {
return formatError(err)
}
ctx.Response.Printf(`{success: true, imageID: "%s", thumbnailURL: "%s", thumbnailSize: %d}`, i.ID, v.FileURL().URL(ctx), thumbnailSize)
return nil
},
))
// todo move to media.js
func uploadImageButtonScript(ctx *view.Context, parentSelector, dropZoneSelector, listSelector string, thumbnailSize int, onComplete string) string {
extraDropzones := "[]"
if dropZoneSelector != "" {
dropZoneSelector = fmt.Sprintf(`[jQuery("%s")[0]]`, dropZoneSelector)
}
listElement := "null"
if listSelector != "" {
listElement = fmt.Sprintf(`jQuery("%s")[0]`, listSelector)
}
if onComplete == "" {
onComplete = "function(){}"
}
uploadURL := UploadImage.URL(ctx.ForURLArgsConvert(thumbnailSize))
return fmt.Sprintf(
`jQuery(function() {
var uploader = new qq.FileUploader({
debug: true,
element: jQuery("%s")[0],
extraDropzones: %s,
listElement: %s,
action: "%s",
allowedExtensions: ["png", "jpg", "jpeg", "gif", "bmp", "tif", "tiff"],
acceptFiles: ["image/png", "image/jpeg", "image/gif", "image/bmp", "image/tiff"],
sizeLimit: 1024*1024*64,
multiple: false,
onComplete: %s
});
});`,
parentSelector,
extraDropzones,
listElement,
uploadURL,
onComplete,
)
}
// Uses https://github.com/valums/file-uploader
func RequireUploadImageButtonScript(parentSelector, dropZoneSelector, listSelector string, thumbnailSize int, onComplete string) view.View {
return view.RenderView(
func(ctx *view.Context) error {
script := uploadImageButtonScript(ctx, parentSelector, dropZoneSelector, listSelector, thumbnailSize, onComplete)
ctx.Response.RequireScript(script, 20)
if !Config.NoDynamicStyleAndScript {
ctx.Response.RequireStyleURL("/media/fileuploader.css", 0)
ctx.Response.RequireScriptURL("/media/fileuploader.js", 0)
}
return nil
},
)
}
func UploadImageButton(dropZoneSelector, listSelector string, thumbnailSize int, onComplete string) view.View {
var button view.Div
button.Content = view.Views{
view.H1("jQuery required!"),
RequireUploadImageButtonScript("#"+button.ID(), dropZoneSelector, listSelector, thumbnailSize, onComplete),
}
return &button
}