实现 MinIO 对象存储图片流水线(可迁移 OSS)
- 新增 S3 兼容 Storage 抽象与 MinIO 实现,compose 启动 MinIO - 上传接口:校验 → 缩放 → WebP → 主图/缩略图入库 - 消息图片 content 改为对象 URL,拒绝 base64 - 工作台/访客端改为先上传再发消息
This commit is contained in:
@@ -1,22 +1,25 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
import "testing"
|
||||
|
||||
func TestValidateMessageContent(t *testing.T) {
|
||||
validImage := "data:image/png;base64,aGVsbG8="
|
||||
if content, err := validateMessageContent("image", validImage); err != nil || content != validImage {
|
||||
t.Fatalf("合法图片校验失败: content=%q err=%v", content, err)
|
||||
SetImagePublicBase("http://localhost:9000/kefu")
|
||||
|
||||
if _, err := validateMessageContent("text", "hello"); err != nil {
|
||||
t.Fatalf("文本消息应通过: %v", err)
|
||||
}
|
||||
if _, err := validateMessageContent("image", "data:image/webp;base64,aGVsbG8="); err == nil {
|
||||
t.Fatal("不支持的图片格式未被拦截")
|
||||
if _, err := validateMessageContent("text", ""); err == nil {
|
||||
t.Fatal("空文本应失败")
|
||||
}
|
||||
if _, err := validateMessageContent("text", " "); err == nil {
|
||||
t.Fatal("空白文本未被拦截")
|
||||
|
||||
validURL := "http://localhost:9000/kefu/tenants/1/chat/a.webp"
|
||||
if content, err := validateMessageContent("image", validURL); err != nil || content != validURL {
|
||||
t.Fatalf("合法图片 URL 校验失败: content=%q err=%v", content, err)
|
||||
}
|
||||
if _, err := validateMessageContent("text", strings.Repeat("字", maxTextMessageLength+1)); err == nil {
|
||||
t.Fatal("超长文本未被拦截")
|
||||
if _, err := validateMessageContent("image", "data:image/png;base64,aGVsbG8="); err == nil {
|
||||
t.Fatal("base64 图片应被拒绝")
|
||||
}
|
||||
if _, err := validateMessageContent("image", "https://evil.example.com/a.webp"); err == nil {
|
||||
t.Fatal("外域图片 URL 应被拒绝")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user