以下是一个简单示例,展示如何使用 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 客户端来上传图片。您需要将 endpointaccessKeyIdaccessKeySecretbucketName 替换为您自己的 OSS 信息。

uploadToOss 函数中,我们生成一个唯一的文件名,并将其作为 OSS 对象键。我们使用 encodeImage 函数将图像编码为 PNG 格式,并将其上传到 OSS。

请注意,此示例仅用于说明目的。您应该考虑添加错误处理和其他安全性检查,以确保应用程序的正确性和安全性。

Golang Gin 框架:获取远程网络图片 URL,下载到 OSS 并校验大小和格式

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

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