forked from miguelpruivo/flutter_file_picker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.go
More file actions
executable file
·125 lines (97 loc) · 3.21 KB
/
plugin.go
File metadata and controls
executable file
·125 lines (97 loc) · 3.21 KB
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package file_picker
import (
"encoding/json"
"github.com/gen2brain/dlgs"
"github.com/go-flutter-desktop/go-flutter"
"github.com/go-flutter-desktop/go-flutter/plugin"
"github.com/pkg/errors"
"os"
"path/filepath"
)
const channelName = "miguelruivo.flutter.plugins.filepicker"
type FilePickerPlugin struct{}
var _ flutter.Plugin = &FilePickerPlugin{} // compile-time type check
func (p *FilePickerPlugin) InitPlugin(messenger plugin.BinaryMessenger) error {
channel := plugin.NewMethodChannel(messenger, channelName, plugin.JSONMethodCodec{})
channel.CatchAllHandleFunc(p.handleFilePicker)
return nil
}
func (p *FilePickerPlugin) handleFilePicker(methodCall interface{}) (reply interface{}, err error) {
method := methodCall.(plugin.MethodCall).Method
if "dir" == method {
dirPath, err := dirDialog("Select a directory")
if err != nil {
return nil, errors.Wrap(err, "failed to open dialog picker")
}
return dirPath, nil
}
var arguments map[string]interface{}
err = json.Unmarshal(methodCall.(plugin.MethodCall).Arguments.(json.RawMessage), &arguments)
if err != nil {
return nil, errors.Wrap(err, "failed to decode arguments")
}
var allowedExtensions []string
// Parse extensions
if arguments != nil && arguments["allowedExtensions"] != nil {
allowedExtensions = make([]string, len(arguments["allowedExtensions"].([]interface{})))
for i := range arguments["allowedExtensions"].([]interface{}) {
allowedExtensions[i] = arguments["allowedExtensions"].([]interface{})[i].(string)
}
}
selectMultiple, ok := arguments["allowMultipleSelection"].(bool) //method.Arguments.(bool)
if !ok {
return nil, errors.Wrap(err, "invalid format for argument, not a bool")
}
filter, err := fileFilter(method, allowedExtensions, len(allowedExtensions), selectMultiple)
if err != nil {
return nil, errors.Wrap(err, "failed to get filter")
}
withData, ok := arguments["withData"].(bool)
var selectedFilePaths []string
if selectMultiple {
filePaths, _, err := dlgs.FileMulti("Select one or more files", filter)
if err != nil {
return nil, errors.Wrap(err, "failed to open dialog picker")
}
selectedFilePaths = make([]string, len(filePaths))
for i, filePath := range filePaths {
selectedFilePaths[i] = filePath
}
} else {
selectedFilePaths = make([]string, 1)
filePath, err := fileDialog("Select a file", filter)
if err != nil {
return nil, errors.Wrap(err, "failed to open dialog picker")
}
selectedFilePaths[0] = filePath
}
result := make([]map[string]interface{}, len(selectedFilePaths))
for i, filePath := range selectedFilePaths {
file, err := os.Open(filePath)
if err != nil {
return nil, errors.Wrap(err, "Can't open selected file")
}
fi, err := file.Stat()
if err != nil {
return nil, errors.Wrap(err, "Can't open selected file")
}
var bytes []byte
if withData {
_, err := file.Read(bytes)
if err != nil {
return nil, errors.Wrap(err, "Can't read selected file")
}
}
result[i] = map[string]interface{}{
"path": filePath,
"name": filepath.Base(filePath),
"bytes": bytes,
"size": fi.Size(),
}
err = file.Close()
if err != nil {
return nil, errors.Wrap(err, "Can't close selected file after reading")
}
}
return result, nil
}