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)
	})

github個人博客

https://wangyufenggogogo.github.io


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM