golang 获取上传文件
时间: 2025-01-04 21:15:51 浏览: 61
### Golang 实现获取与处理上传文件
#### 使用标准库实现单个文件上传
当构建Web服务时,有时需要提供上传文件的功能。下面展示了一个利用Go语言的标准库`net/http`来创建一个简单的HTTP服务器,并允许客户端上传文件的例子[^1]。
```go
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println("Error Retrieving the File")
fmt.Println(err)
return
}
defer file.Close()
f, err := os.OpenFile("./uploads/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
io.Copy(f, file)
fmt.Fprintf(w, "Successfully Uploaded!")
}
func setupRoutes() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8080", nil)
}
func main() {
setupRoutes()
}
```
此代码片段定义了一个名为`uploadHandler`的处理器函数用于接收POST请求中的文件数据;并通过调用`FormFile()`方法获得上传文件的对象及其元信息。之后打开一个新的本地文件准备写入接收到的数据,最后使用`io.Copy()`完成实际的数据复制操作[^3]。
#### 利用 Gin 框架简化开发过程
对于更复杂的项目来说,采用像Gin这样的第三方框架能够极大地提高效率。这里给出一段基于Gin框架实现相同功能——即接受来自用户的文件提交并将之保存至服务器端指定位置上的示例程序:
```go
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
"path/filepath"
)
func UploadSingleFile(c *gin.Context) {
form, _ := c.MultipartForm()
files := form.File["files"]
for _, file := range files {
log.Printf("Received file: %v\n", file.Filename)
ext := filepath.Ext(file.Filename)
log.Printf("File extension is :%s \n", ext)
err := c.SaveUploadedFile(file, "./uploads/" + file.Filename)
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("error:%s", err.Error()))
return
}
}
c.JSON(http.StatusOK, gin.H{"message": "Files uploaded successfully"})
}
func main() {
r := gin.Default()
r.POST("/upload", UploadSingleFile)
r.Run(":9090") // listen and serve on 0.0.0.0:9090
}
```
上述例子展示了如何借助于Gin内置的方法轻松地解析多部分表单(`MultipartForm`)并从中提取出所有被标记为`files[]`字段内的文件项。此外还运用了`filepath.Ext()`函数来取得每个文件对应的扩展名[^4]。
阅读全文
相关推荐


















