Golang中如何提取Blob字段
Golang中如何提取Blob字段 我有一个MySQL数据库表,其中包含图像字段。
如何提取图像并将其与结构体字段绑定。
我需要选择什么字段类型。
以及从前端如何管理。
// 代码示例
3 回复
使用服务器目录中的图像路径这样的字符串是更好的主意,但我认为字节切片是数据库中图像格式的数据类型。
更多关于Golang中如何提取Blob字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中提取MySQL的BLOB字段,推荐使用[]byte类型。以下是完整的示例:
1. 数据库表结构
CREATE TABLE images (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
image_data MEDIUMBLOB,
mime_type VARCHAR(50)
);
2. Go结构体定义
type Image struct {
ID int `db:"id"`
Name string `db:"name"`
ImageData []byte `db:"image_data"`
MimeType string `db:"mime_type"`
}
3. 查询并绑定数据
// 使用database/sql
func GetImageByID(db *sql.DB, id int) (*Image, error) {
var img Image
err := db.QueryRow("SELECT id, name, image_data, mime_type FROM images WHERE id = ?", id).
Scan(&img.ID, &img.Name, &img.ImageData, &img.MimeType)
if err != nil {
return nil, err
}
return &img, nil
}
// 使用sqlx(推荐)
func GetImageByID(db *sqlx.DB, id int) (*Image, error) {
var img Image
err := db.Get(&img, "SELECT * FROM images WHERE id = ?", id)
if err != nil {
return nil, err
}
return &img, nil
}
4. HTTP接口返回图像
func ServeImage(w http.ResponseWriter, r *http.Request) {
idStr := r.URL.Query().Get("id")
id, _ := strconv.Atoi(idStr)
img, err := GetImageByID(db, id)
if err != nil {
http.Error(w, "Image not found", http.StatusNotFound)
return
}
// 设置正确的Content-Type
w.Header().Set("Content-Type", img.MimeType)
w.Header().Set("Content-Length", strconv.Itoa(len(img.ImageData)))
// 写入图像数据
w.Write(img.ImageData)
}
5. 前端使用
<!-- 直接显示图像 -->
<img src="/api/images?id=1" alt="Image">
<!-- 或使用Base64编码 -->
<img src="data:image/jpeg;base64,{{.Base64Data}}" alt="Image">
6. Base64编码示例
func GetImageWithBase64(db *sqlx.DB, id int) (map[string]interface{}, error) {
img, err := GetImageByID(db, id)
if err != nil {
return nil, err
}
base64Str := base64.StdEncoding.EncodeToString(img.ImageData)
return map[string]interface{}{
"id": img.ID,
"name": img.Name,
"mime_type": img.MimeType,
"data_url": fmt.Sprintf("data:%s;base64,%s", img.MimeType, base64Str),
}, nil
}
7. 插入BLOB数据
func SaveImage(db *sql.DB, name string, imageData []byte, mimeType string) error {
_, err := db.Exec(
"INSERT INTO images (name, image_data, mime_type) VALUES (?, ?, ?)",
name, imageData, mimeType,
)
return err
}
// 从文件读取
func SaveImageFromFile(db *sql.DB, name, filePath string) error {
data, err := ioutil.ReadFile(filePath)
if err != nil {
return err
}
mimeType := http.DetectContentType(data)
return SaveImage(db, name, data, mimeType)
}
关键点:
- 使用
[]byte类型存储BLOB数据 - 查询时直接Scan到
[]byte字段 - 通过HTTP接口返回时设置正确的Content-Type
- 前端可通过URL直接引用或使用Base64 Data URL


