以下是一个示例代码,使用 Golang Gin 框架将网络图片 URL 下载到 OSS,并校验大小和格式:

package main

import (
    "bytes"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
    "path/filepath"
    "strings"

    "github.com/gin-gonic/gin"
    "github.com/minio/minio-go"
)

func main() {
    // 初始化 Gin 框架
    r := gin.Default()

    // 初始化 Minio 客户端
    endpoint := "minio.example.com"
    accessKeyID := "access_key"
    secretAccessKey := "secret_key"
    useSSL := true
    minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 定义上传接口
    r.POST("/upload", func(c *gin.Context) {
        // 获取文件
        file, err := c.FormFile("file")
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": err.Error(),
            })
            return
        }

        // 校验文件类型和大小
        if !strings.HasSuffix(file.Filename, ".jpg") &&
            !strings.HasSuffix(file.Filename, ".jpeg") &&
            !strings.HasSuffix(file.Filename, ".png") {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": "Only JPG, JPEG, and PNG files are allowed",
            })
            return
        }
        if file.Size > 1<<20 {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": "File size should be less than 1MB",
            })
            return
        }

        // 下载文件
        resp, err := http.Get(c.PostForm("url"))
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": err.Error(),
            })
            return
        }
        defer resp.Body.Close()

        // 初始化 buffer 和 writer
        buf := bytes.NewBuffer(nil)
        writer := multipart.NewWriter(buf)

        // 创建文件 part
        part, err := writer.CreateFormFile("file", file.Filename)
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": err.Error(),
            })
            return
        }

        // 将文件内容复制到 part
        _, err = io.Copy(part, resp.Body)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "error": err.Error(),
            })
            return
        }

        // 关闭 writer
        writer.Close()

        // 上传文件到 Minio
        bucketName := "my-bucket"
        objectName := filepath.Base(file.Filename)
        contentType := "image/jpeg" // 可以根据实际情况设置
        _, err = minioClient.PutObject(bucketName, objectName, buf, int64(buf.Len()), minio.PutObjectOptions{
            ContentType: contentType,
        })
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "error": err.Error(),
            })
            return
        }

        // 返回上传成功的信息
        c.JSON(http.StatusOK, gin.H{
            "message": fmt.Sprintf("File %s uploaded successfully", objectName),
        })
    })

    // 启动服务
    r.Run(":8080")
}

在上面的代码中:

  • 我们首先初始化了一个 Gin 框架和一个 Minio 客户端。
  • 然后,我们定义了一个上传接口,它接收一个文件和一个 URL 参数。
  • 我们首先校验了文件类型和大小。
  • 然后,我们使用 http 包下载了网络图片。
  • 我们使用 multipart 包创建了一个 buffer 和一个 writer,并将文件内容复制到 writer 中。
  • 最后,我们使用 Minio 客户端将文件上传到 Minio,并返回上传成功的信息。

请注意,这只是一个示例代码,您需要根据您的实际情况进行修改。例如,您可能需要添加身份验证、错误处理和日志记录等功能。


原文地址: https://www.cveoy.top/t/topic/lCsn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录