在Go語(yǔ)言中處理并發(fā)文件上傳問(wèn)題時(shí),可以使用goroutine來(lái)實(shí)現(xiàn)并發(fā)上傳。下面是一個(gè)簡(jiǎn)單的示例代碼:
package main
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8080", nil)
}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
r.ParseMultipartForm(32 << 20) // 設(shè)置最大文件大小
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
filename := handler.Filename
savePath := filepath.Join("./uploads", filename)
out, err := os.Create(savePath)
if err != nil {
fmt.Println(err)
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
fmt.Println(err)
return
}
fmt.Fprintf(w, "文件上傳成功!")
}
}
在這個(gè)示例中,我們通過(guò)http.HandleFunc
函數(shù)將uploadHandler
函數(shù)綁定到/upload
路徑上。在uploadHandler
函數(shù)中,我們使用r.ParseMultipartForm
函數(shù)解析表單數(shù)據(jù),并通過(guò)r.FormFile
函數(shù)獲取上傳的文件。
然后,我們通過(guò)os.Create
函數(shù)創(chuàng)建一個(gè)文件,之后使用io.Copy
函數(shù)將上傳的文件內(nèi)容拷貝到新創(chuàng)建的文件中。最后,使用fmt.Fprintf
函數(shù)向客戶端返回上傳成功的消息。
這個(gè)示例中的代碼是串行執(zhí)行的,如果需要并發(fā)處理多個(gè)文件上傳,可以將文件上傳的處理放在一個(gè)goroutine中。具體實(shí)現(xiàn)方式可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。