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

关键点:

  1. 使用[]byte类型存储BLOB数据
  2. 查询时直接Scan到[]byte字段
  3. 通过HTTP接口返回时设置正确的Content-Type
  4. 前端可通过URL直接引用或使用Base64 Data URL
回到顶部