Golang Gin 框架:将网络图片 URL 下载到 OSS 并校验大小和格式
以下是一个示例代码,使用 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 著作权归作者所有。请勿转载和采集!