golang 實現檔案上傳下載
阿新 • • 發佈:2021-10-25
golang實現檔案的上傳下載功能
Gin框架上傳下載
上傳(支援批量上傳)
httpRouter.POST("/upload", func(ctx *gin.Context) { forms, err := ctx.MultipartForm() if err != nil { fmt.Println("error", err) } files := forms.File["fileName"] for _, v := range files { if err := ctx.SaveUploadedFile(v, fmt.Sprintf("%s%s", "./file/", v.Filename)); err != nil { fmt.Println("儲存檔案失敗") } } })
下載
httpRouter.GET("/download", func(ctx *gin.Context) { filePath := ctx.Query("url") //開啟檔案 file, err := os.Open("./" + filePath) if err != nil { fmt.Println("開啟檔案錯誤", err) } defer file.Close() //獲取檔案的名稱 fileName := path.Base(filePath) ctx.Header("Content-Type", "application/octet-stream") ctx.Header("Content-Disposition", "attachment; url="+fileName) ctx.Header("Content-Transfer-Encoding", "binary") ctx.Header("Cache-Control", "no-cache") ctx.File("./" + filePath) })
原生的上傳下載
上傳(支援批量上傳)
http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) { if err := r.ParseMultipartForm(20); err != nil { fmt.Println("解析url失敗", err) } if r.Method == "GET" { files, err := template.ParseFiles("fileName") if err != nil { fmt.Println("解析檔案失敗", err) } files.Execute(w, nil) } else { files := r.MultipartForm.File["fileName"] for _, v := range files { f, err := os.Create("./file/" + v.Filename) if err != nil { fmt.Println("建立檔案失敗") } file, err := v.Open() if err != nil { fmt.Println("開啟檔案失敗") } _, err = io.Copy(f, file) if err != nil { fmt.Println("拷貝檔案資料失敗") } } w.Write([]byte("upload success")) } })
下載
http.HandleFunc("/download", func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
fmt.Println("解析url失敗", err)
}
fileName := r.Form["fileName"][0]
filePath := "./" + fileName
_, err := os.Stat(filePath)
if err != nil || os.IsNotExist(err) {
fmt.Println("檔案不存在", err)
}
bytes, err := os.ReadFile(filePath)
if err != nil {
fmt.Println("讀取檔案失敗", err)
}
w.Header().Add("Content-Type", "application/octet-stream")
w.Header().Add("Content-Disposition", "attachment; filename= "+fileName)
w.Write(bytes)
})