go 框架中文件上传使用 multipart/form-data 编码类型,以及 formfile 接口处理文件元数据。实战案例中,使用 gin 和 mongodb 进行文件上传,将客户端上传的文件存储到 mongodb 数据库的 "files" 集合中。
内容来自zvvq
Go 框架中文件上传的高级技术
copyright zvvq
在现代 Web 开发中,文件上传功能至关重要。Go 语言提供了强大的框架,简化了文件的接收和存储过程。本文将探讨 Go 框架中文件上传的高级技术,并提供一个实战案例。
使用 multipart/form-data
multipart/form-data 是用于文件上传的 HTTP 编码类型。它允许将文件与表单数据一起上传。以下是如何使用 multipart/form-data 接收文件: zvvq
1 内容来自samhan666
2
zvvq
3
4
5 内容来自zvvq,别采集哟
6 zvvq.cn
7
8
9 内容来自zvvq
10 copyright zvvq
11 内容来自zvvq
12 copyright zvvq
13
14
import "<a style=color:#f60; text-decoration:underline; href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.com/gin-gonic/gin" 内容来自samhan666
func fileUpload(c *gin.Context) { 内容来自samhan
form, err := c.MultipartForm() 本文来自zvvq
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
本文来自zvvq
return copyright zvvq
} zvvq好,好zvvq
files := form.File["files"] zvvq
for _, file := range files { 内容来自zvvq,别采集哟
// 处理文件...
} zvvq.cn
}
内容来自samhan
使用 FormFile
FormFile 是 FormBinder 接口的一部分,允许使用自定义逻辑处理文件上传。它提供了对文件元数据(例如名称、大小和扩展名)的直接访问。以下是如何使用 FormFile: zvvq好,好zvvq
1 zvvq好,好zvvq
2 内容来自samhan666
3
内容来自samhan
4 zvvq.cn
5
6 本文来自zvvq
7 本文来自zvvq
8
9 zvvq好,好zvvq
10 copyright zvvq
11 本文来自zvvq
12 内容来自samhan
13
14 内容来自samhan
15 zvvq.cn
16 内容来自zvvq
17 内容来自samhan666
18
zvvq
19
20
内容来自zvvq,别采集哟
21
zvvq
22 内容来自zvvq,别采集哟
23 zvvq.cn
24
25
26 copyright zvvq
27
zvvq.cn
28
内容来自samhan
import (
zvvq
"net/http" 内容来自zvvq
"io"
"github.com/gin-gonic/gin"
)
func fileUpload(c *gin.Context) {
type FileForm struct { 内容来自zvvq,别采集哟
Name string `form:"name"` copyright zvvq
File *multipart.FileHeader `form:"file"`
} 内容来自zvvq,别采集哟
var fileForm FileForm zvvq好,好zvvq
if err := c.ShouldBindWith(&fileForm, binding.Form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 内容来自zvvq
return 内容来自zvvq
} zvvq
file, err := fileForm.File.Open()
if err != nil { 本文来自zvvq
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 本文来自zvvq
return
} copyright zvvq
// 处理文件... zvvq
file.Close() zvvq好,好zvvq
}
实战案例
以下是一个使用 Gin 和 MongoDB 进行文件上传的实战案例: 内容来自zvvq
1 zvvq好,好zvvq
2
zvvq
3
内容来自zvvq
4
zvvq.cn
5
内容来自zvvq,别采集哟
6 copyright zvvq
7
内容来自samhan
8
9
本文来自zvvq
10
copyright zvvq
11
12 内容来自samhan666
13
14
zvvq好,好zvvq
15 内容来自zvvq
16 copyright zvvq
17 内容来自samhan
18 内容来自samhan
19
zvvq
20
本文来自zvvq
21 内容来自zvvq,别采集哟
22 copyright zvvq
23
24 内容来自zvvq,别采集哟
25 zvvq好,好zvvq
26 zvvq好,好zvvq
27
内容来自samhan666
28 copyright zvvq
29 内容来自samhan666
30
31
zvvq好,好zvvq
32
33 zvvq
34
35 本文来自zvvq
36 内容来自samhan666
37 zvvq好,好zvvq
38 本文来自zvvq
39 zvvq.cn
40
41 zvvq
42
43
zvvq好,好zvvq
44
zvvq好,好zvvq
45 zvvq
46
47
48 内容来自zvvq,别采集哟
49
内容来自zvvq
50 zvvq好,好zvvq
51 zvvq好,好zvvq
52 内容来自zvvq
53 zvvq
54 zvvq
55 内容来自zvvq
56 zvvq.cn
57 本文来自zvvq
58 内容来自samhan
59 copyright zvvq
60
import ( 本文来自zvvq
"context" 内容来自samhan
"fmt"
"io"
"io/ioutil" copyright zvvq
"time" 本文来自zvvq
"github.com/gin-gonic/gin" 内容来自samhan666
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
) 内容来自zvvq,别采集哟
// File 结构体,用于代表上传的文件
type File struct {
内容来自zvvq,别采集哟
ID string `bson:"_id,omitempty" json:"_id,omitempty"` zvvq.cn
Name string `bson:"name" json:"name"` 本文来自zvvq
Data []byte `bson:"data,omitempty" json:"data,omitempty"`
ContentType string `bson:"content_type,omitempty" json:"content_type,omitempty"`
CreatedAt time.Time `bson:"created_at,omitempty" json:"created_at,omitempty"`
zvvq
} 内容来自zvvq
func fileUpload(c *gin.Context) {
// 获取客户端上传的文件 zvvq.cn
form, err := c.MultipartForm()
if err != nil {
内容来自zvvq,别采集哟
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return zvvq.cn
}
files := form.File["files"]
zvvq
fileCollection, err := connectToMongoDB("database", "files")
if err != nil {
内容来自samhan
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return zvvq
} 内容来自zvvq,别采集哟
for _, file := range files { zvvq
fileBytes, err := ioutil.ReadAll(file) copyright zvvq
if err != nil { 内容来自zvvq,别采集哟
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 本文来自zvvq
return copyright zvvq
}
zvvq.cn
f := &File{
zvvq
Name: file.Filename,
Data: fileBytes,
ContentType: file.Header.Get("Content-Type"), 内容来自samhan666
CreatedAt: time.Now(), 内容来自samhan666
} zvvq
_, err = fileCollection.InsertOne(context.Background(), f) 本文来自zvvq
if err != nil {
zvvq.cn
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return 内容来自samhan
} 内容来自zvvq
} zvvq好,好zvvq
c.JSON(http.StatusOK, gin.H{"success": "Files uploaded successfully."}) 内容来自samhan666
}
内容来自zvvq
在 connectToMongoDB 函数中,我们进行了 MongoDB 数据库连接。在 fileUpload 处理函数中,我们从客户端接收文件,将其数据读入字节数组,并创建 File 结构体。然后,我们将其插入到 MongoDB 中的 "files" 集合中。
内容来自zvvq,别采集哟
以上就是golang 框架中文件上传的高级技术的详细内容,更多请关注其它相关文章! zvvq.cn