来讲解一下“GO语言实现文件上传的示例代码”的完整攻略,过程中包含两条示例说明。
一、前言
文件上传是我们在 Web 开发过程中经常遇到的需求之一,那么在 GO 语言中如何实现文件上传呢?
二、基本原理
文件上传的基本原理就是前端将文件通过表单提交到后台,后台再将文件写入指定的目录中,在 GO 语言中可以通过 net/http
包的 ListenAndServe
和 http.HandleFunc
函数实现文件上传。
具体而言,前端通过 HTML 表单将文件上传至后台,后台通过 multipart/form-data
解析读取文件,再利用 io.Copy
函数写入指定目录,即可完成文件上传的功能。
三、示例说明
1. 单文件上传
func main() {
http.HandleFunc("/upload", func(writer http.ResponseWriter, request *http.Request) {
if request.Method == "POST" {
file, handler, err := request.FormFile("file")
if err != nil {
fmt.Println("Error Retrieving the File")
fmt.Println(err)
return
}
defer file.Close()
fmt.Printf("Uploaded File: %+v\n", handler.Filename)
fmt.Printf("File Size: %+v\n", handler.Size)
fmt.Printf("File MIME Header: %+v\n", handler.Header)
// Create a file to store file data
dst, err := os.Create(handler.Filename)
if err != nil {
fmt.Println(err)
return
}
defer dst.Close()
// Copy the uploaded file to the created file
if _, err := io.Copy(dst, file); err != nil {
fmt.Println(err)
return
}
fmt.Fprintf(writer, "File uploaded successfully : ")
fmt.Fprintf(writer, handler.Filename)
} else {
fmt.Fprintf(writer, "Error : Unexpected request type")
}
})
http.ListenAndServe(":8000", nil)
}
上述代码实现了单文件上传,用户通过 HTML 表单上传文件,后端接收文件并存储到本地,同时返回存储的文件名。
2. 多文件上传
func MultipleUploads(writer http.ResponseWriter, request *http.Request) {
if request.Method != "POST" {
writer.WriteHeader(http.StatusBadRequest)
writer.Write([]byte("Error: Unexpected request type"))
return
}
// Set max allowed memory
request.ParseMultipartForm(2 * 1024 * 1024) // 2 MB
// Get file headers
files := request.MultipartForm.File["files"]
// Create directory for storing files
os.MkdirAll("./uploads", os.ModePerm)
for _, fileHeader := range files {
// Open file
file, err := fileHeader.Open()
defer file.Close()
if err != nil {
writer.WriteHeader(http.StatusInternalServerError)
writer.Write([]byte(fmt.Sprintf("Error: Opening file: %s", fileHeader.Filename)))
return
}
// Create destination file
destinationFile, err := os.Create(fmt.Sprintf("./uploads/%s", fileHeader.Filename))
defer destinationFile.Close()
if err != nil {
writer.WriteHeader(http.StatusInternalServerError)
writer.Write([]byte(fmt.Sprintf("Error: Creating file: %s", fileHeader.Filename)))
return
}
// Copy file
_, err = io.Copy(destinationFile, file)
if err != nil {
writer.WriteHeader(http.StatusInternalServerError)
writer.Write([]byte(fmt.Sprintf("Error: Copying file=%s - %v", fileHeader.Filename, err)))
return
}
writer.Write([]byte(fmt.Sprintf("File uploaded successfully: %s\n", fileHeader.Filename)))
}
}
上述代码实现了多文件上传,将文件保存在本地 ./uploads
目录下,同时返回上传成功的文件名,文件数不限。
四、总结
本文讲解了 GO 语言实现文件上传的示例代码,其中包含了单文件上传和多文件上传的示例说明。开发者可以根据需求选择适合自己的代码实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GO语言实现文件上传的示例代码 - Python技术站