Golang Gin 框架:获取远程网络图片 URL,下载到 OSS 并校验大小和格式
以下是一个简单示例,展示如何使用 Golang 和 Gin 框架获取远程网络图片 URL,下载到 OSS,并校验大小和图片格式:
package main
import (
"bytes"
"fmt"
"image"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"io/ioutil"
"net/http"
"os"
"strings"
"github.com/gin-gonic/gin"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
url := c.PostForm("url")
if url == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "URL not provided"})
return
}
img, err := downloadImage(url)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Could not download image"})
return
}
if !isValidImage(img) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid image format"})
return
}
if !isValidSize(img) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid image size"})
return
}
err = uploadToOss(img)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Could not upload image"})
return
}
c.JSON(http.StatusOK, gin.H{"status": "Image uploaded successfully"})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
func downloadImage(url string) (image.Image, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
img, _, err := image.Decode(bytes.NewReader(body))
if err != nil {
return nil, err
}
return img, nil
}
func isValidImage(img image.Image) bool {
switch img.(type) {
case *image.JPEG, *image.PNG, *image.GIF:
return true
default:
return false
}
}
func isValidSize(img image.Image) bool {
width := img.Bounds().Dx()
height := img.Bounds().Dy()
if width > 1024 || height > 1024 {
return false
}
return true
}
func uploadToOss(img image.Image) error {
endpoint := "your_oss_endpoint"
accessKeyId := "your_access_key_id"
accessKeySecret := "your_access_key_secret"
bucketName := "your_bucket_name"
client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
if err != nil {
return err
}
bucket, err := client.Bucket(bucketName)
if err != nil {
return err
}
filename := generateFilename()
buffer := new(bytes.Buffer)
err = encodeImage(img, buffer)
if err != nil {
return err
}
err = bucket.PutObject(filename, bytes.NewReader(buffer.Bytes()))
if err != nil {
return err
}
return nil
}
func generateFilename() string {
return fmt.Sprintf("%d.png", time.Now().UnixNano())
}
func encodeImage(img image.Image, buffer *bytes.Buffer) error {
err := png.Encode(buffer, img)
if err != nil {
return err
}
return nil
}
在上面的代码中,我们使用 downloadImage 函数从远程 URL 下载图片,并检查图片格式和大小是否有效。如果图片有效,则使用 uploadToOss 函数将其上传到 OSS。
我们使用 Aliyun OSS Go SDK 客户端来上传图片。您需要将 endpoint、accessKeyId、accessKeySecret 和 bucketName 替换为您自己的 OSS 信息。
在 uploadToOss 函数中,我们生成一个唯一的文件名,并将其作为 OSS 对象键。我们使用 encodeImage 函数将图像编码为 PNG 格式,并将其上传到 OSS。
请注意,此示例仅用于说明目的。您应该考虑添加错误处理和其他安全性检查,以确保应用程序的正确性和安全性。
原文地址: https://www.cveoy.top/t/topic/lCsI 著作权归作者所有。请勿转载和采集!