Skip to content

Commit d12f68c

Browse files
committed
allow uploading multiple files at one time
1 parent addca42 commit d12f68c

File tree

3 files changed

+71
-48
lines changed

3 files changed

+71
-48
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010

1111
# Output of the go coverage tool, specifically when used with LiteIDE
1212
*.out
13+
14+
15+
__debug_bin
16+
http-server

.vscode/launch.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Launch App",
9+
"type": "go",
10+
"request": "launch",
11+
"mode": "debug",
12+
"program": "${workspaceFolder}",
13+
"args": ["start", "--upload"]
14+
}
15+
]
16+
}

cmd/start.go

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func uploadPage(w http.ResponseWriter, r *http.Request) {
8686
</head>
8787
<body>
8888
<form enctype="multipart/form-data" action="/api/upload" method="post">
89-
<input type="file" name="file01" />
89+
<input type="file" multiple="multiple" name="files" />
9090
<input type="submit" value="upload" />
9191
</form>
9292
</body>
@@ -99,56 +99,59 @@ func uploadFile(w http.ResponseWriter, r *http.Request) {
9999
// 1. parse input
100100
r.ParseMultipartForm(10 << 20) // 10 MB
101101

102-
// 2. retrieve file
103-
file, header, err := r.FormFile("file01")
104-
if err != nil {
105-
fmt.Println(err)
106-
w.WriteHeader(400)
107-
w.Write([]byte("Error retrieving the file"))
108-
return
109-
}
110-
defer file.Close()
111-
112-
fileName := header.Filename
113-
fileSize := header.Size
114-
fmt.Println("=======================================")
115-
fmt.Printf("Uploading file: %+v\n", fileName)
116-
fmt.Printf("File : %.2f MB\n", float64(fileSize)/(1<<20))
117-
fmt.Printf("MIME type: %+v\n", header.Header["Content-Type"])
118-
119-
// 3. write temporary file on our server
120-
tempFile, err := ioutil.TempFile("", "http-upload-*")
121-
if err != nil {
122-
fmt.Println(err)
123-
w.WriteHeader(500)
124-
w.Write([]byte("Error creating temp file"))
125-
return
126-
}
127-
// fmt.Printf("Temp file %+v\n", tempFile.Name())
128-
defer tempFile.Close()
129-
130-
if _, err := io.CopyN(tempFile, file, fileSize); err != nil {
131-
fmt.Println(err)
132-
w.WriteHeader(500)
133-
w.Write([]byte("Error saving the file"))
134-
return
135-
}
102+
fhs := r.MultipartForm.File["files"]
103+
for _, fh := range fhs {
104+
// 2. retrieve file
105+
file, err := fh.Open()
106+
if err != nil {
107+
fmt.Println(err)
108+
w.WriteHeader(400)
109+
w.Write([]byte("Error retrieving the file"))
110+
return
111+
}
112+
defer file.Close()
136113

137-
// 4. move file
138-
newFileName := fileName
139-
extension := filepath.Ext(fileName)
140-
fileNameNoExt := fileName[0 : len(fileName)-len(extension)]
141-
i := 2
142-
for {
143-
if _, err := os.Stat(filepath.Join(folder, newFileName)); err == nil {
144-
// file exists
145-
newFileName = fmt.Sprintf("%s-%d%s", fileNameNoExt, i, extension)
146-
i++
147-
} else {
148-
break
114+
fileName := fh.Filename
115+
fileSize := fh.Size
116+
fmt.Println("=======================================")
117+
fmt.Printf("Uploading file: %+v\n", fileName)
118+
fmt.Printf("File : %.2f MB\n", float64(fileSize)/(1<<20))
119+
fmt.Printf("MIME type: %+v\n", fh.Header["Content-Type"])
120+
121+
// 3. write temporary file on our server
122+
tempFile, err := ioutil.TempFile("", "http-upload-*")
123+
if err != nil {
124+
fmt.Println(err)
125+
w.WriteHeader(500)
126+
w.Write([]byte("Error creating temp file"))
127+
return
128+
}
129+
// fmt.Printf("Temp file %+v\n", tempFile.Name())
130+
defer tempFile.Close()
131+
132+
if _, err := io.CopyN(tempFile, file, fileSize); err != nil {
133+
fmt.Println(err)
134+
w.WriteHeader(500)
135+
w.Write([]byte("Error saving the file"))
136+
return
137+
}
138+
139+
// 4. move file
140+
newFileName := fileName
141+
extension := filepath.Ext(fileName)
142+
fileNameNoExt := fileName[0 : len(fileName)-len(extension)]
143+
i := 2
144+
for {
145+
if _, err := os.Stat(filepath.Join(folder, newFileName)); err == nil {
146+
// file exists
147+
newFileName = fmt.Sprintf("%s-%d%s", fileNameNoExt, i, extension)
148+
i++
149+
} else {
150+
break
151+
}
149152
}
153+
os.Rename(tempFile.Name(), filepath.Join(folder, newFileName))
150154
}
151-
os.Rename(tempFile.Name(), filepath.Join(folder, newFileName))
152155

153156
// done
154157
fmt.Printf("Successfully Uploaded File\n\n\n")

0 commit comments

Comments
 (0)