Skip to content

图片处理解决方案

概述

DSPlatform 支持多种图片存储和缩略图处理方案,包括本地存储、阿里云OSS、腾讯云COS、七牛云以及Nginx图片处理。系统通过环境变量配置存储类型,前端自动根据配置生成对应的缩略图URL,实现按需生成、无需预处理的图片处理方案。

核心特性

  • 按需生成:缩略图通过URL参数按需生成,无需预先生成
  • 节省存储:不占用额外存储空间,只存储原图
  • 性能优化:支持CDN加速和缓存机制
  • 灵活配置:通过环境变量统一配置存储类型
  • 多端支持:前端自动识别存储类型并生成对应URL

支持的存储类型

系统支持以下存储类型:

  • local: 本地存储(支持Nginx URL参数缩略图处理)
  • aliyun: 阿里云OSS(支持URL参数缩略图)
  • tencent: 腾讯云COS(支持URL参数缩略图)
  • qiniu: 七牛云(支持URL参数缩略图)

技术架构

前端架构

uniapp/src/utils/
└── image.ts                    # 图片URL处理和缩略图工具
    ├── formatImageUrl()        # 主入口函数
    ├── processImageUrl()       # 缩略图处理
    ├── addOssThumbnail()       # 阿里云OSS处理
    ├── addCosThumbnail()       # 腾讯云COS处理
    ├── addQiniuThumbnail()     # 七牛云处理
    └── addNginxThumbnail()     # Nginx处理

处理流程

后端上传 → 返回相对路径 → 前端拼接完整URL → 添加缩略图参数 → 访问时自动生成

核心原则

  1. 强制配置:必须通过环境变量 VITE_FILE_TYPE 配置存储类型
  2. 不支持URL判断:由于OSS支持自定义域名,不能通过URL判断存储类型
  3. 统一接口:前端使用统一的 formatImageUrl() 方法处理所有图片URL

环境变量配置

前端环境变量

.env.development.env.production 中配置:

env
# 文件存储类型:local | aliyun | tencent | qiniu
VITE_FILE_TYPE=aliyun

# 文件上传地址(本地存储时使用,云存储时可为空或填写CDN地址)
VITE_FILE_BASE_URL=https://your-domain.com

配置示例

开发环境(本地存储)

env
VITE_FILE_TYPE=local
VITE_FILE_BASE_URL=http://localhost:8080

生产环境(阿里云OSS)

env
VITE_FILE_TYPE=aliyun
VITE_FILE_BASE_URL=https://your-bucket.oss-cn-hangzhou.aliyuncs.com

生产环境(腾讯云COS)

env
VITE_FILE_TYPE=tencent
VITE_FILE_BASE_URL=https://your-bucket.cos.ap-shanghai.myqcloud.com

生产环境(七牛云)

env
VITE_FILE_TYPE=qiniu
VITE_FILE_BASE_URL=https://your-bucket.qiniucdn.com

生产环境(本地存储 + Nginx处理)

env
VITE_FILE_TYPE=local
VITE_FILE_BASE_URL=https://your-domain.com

缩略图处理方案

1. 阿里云OSS缩略图

阿里云OSS支持通过URL参数 x-oss-process 进行图片处理,功能强大且性能优秀。

URL格式

https://bucket.oss-cn-hangzhou.aliyuncs.com/path/to/image.jpg?x-oss-process=image/resize,m_lfit,w_200,h_200

参数说明

缩放模式

  • m_lfit: 等比缩放,限制在指定宽高内(推荐,保持比例)
  • m_fixed: 固定宽高,强制缩放(可能变形)
  • m_fill: 等比缩放,短边优先(长边裁剪)
  • m_pad: 等比缩放,填充背景色
  • m_mfit: 等比缩放,宽高都小于指定值

质量参数

  • image/quality,q_85:图片质量 1-100

格式转换

  • image/format,webp:转换为WebP格式(体积更小)
  • image/format,png:转换为PNG格式

其他参数

  • image/interlace,1:渐进式JPEG
  • image/sharpen,100:锐化处理
  • limit_0:允许处理大于4096px的图片

完整示例

# 基础缩略图
?x-oss-process=image/resize,m_lfit,w_200,h_200,limit_0

# 缩略图 + 质量优化
?x-oss-process=image/resize,m_lfit,w_200,h_200,limit_0/image/quality,q_85

# 缩略图 + WebP格式
?x-oss-process=image/resize,m_lfit,w_200,h_200,limit_0/image/format,webp

# 完整处理链
?x-oss-process=image/resize,m_lfit,w_200,h_200,limit_0/image/quality,q_85/image/format,webp

前端使用

typescript
import { formatImageUrl, ThumbnailPresets } from '@/utils/image'

// 基础缩略图(使用默认 imageType)
const thumbnail = formatImageUrl('/path/to/image.jpg', {
  width: 200,
  height: 200,
  mode: 'lfit'
})

// 只指定宽度,高度自动按比例缩放(使用默认 imageType)
const widthOnly = formatImageUrl('/path/to/image.jpg', {
  width: 400
})

// 只指定高度,宽度自动按比例缩放(使用默认 imageType)
const heightOnly = formatImageUrl('/path/to/image.jpg', {
  height: 300
})

// 使用原图,只优化质量和格式(使用默认 imageType)
const optimized = formatImageUrl('/path/to/image.jpg', {
  useOriginal: true,
  format: 'webp',
  quality: 85
})

// 使用预设配置(使用默认 imageType)
const medium = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.medium)

// 缩略图 + WebP格式(推荐,体积更小,使用默认 imageType)
const webpThumbnail = formatImageUrl('/path/to/image.jpg', {
  width: 200,
  height: 200,
  format: 'webp',
  quality: 85
})

2. 腾讯云COS缩略图

腾讯云COS支持通过URL参数 imageView2 进行图片处理。

URL格式

https://bucket.cos.ap-shanghai.myqcloud.com/path/to/image.jpg?imageView2/2/w/200/h/200

参数说明

模式

  • 1: 限定宽高最小值
  • 2: 限定宽高最大值(推荐,等比缩放)
  • 3: 限定宽度
  • 4: 限定高度

质量参数

  • q/85:图片质量 1-100

格式转换

  • format/webp:转换为WebP格式

完整示例

# 基础缩略图
?imageView2/2/w/200/h/200

# 缩略图 + 质量优化
?imageView2/2/w/200/h/200/q/85

# 缩略图 + WebP格式
?imageView2/2/w/200/h/200/format/webp

3. 七牛云缩略图

七牛云支持通过URL参数 imageView2 进行图片处理,格式与腾讯云COS类似。

URL格式

https://bucket.qiniucdn.com/path/to/image.jpg?imageView2/2/w/200/h/200

参数说明

与腾讯云COS相同,使用 imageView2 参数。

4. 本地存储 + Nginx图片处理

当存储类型配置为 local 时,系统会自动使用Nginx URL参数处理缩略图。Nginx可以通过 image_filter 模块处理图片缩略图,适合本地存储场景。

方案优势

  • 性能优秀:C模块处理,速度快
  • 无需PHP:不占用PHP-FPM进程
  • 浏览器缓存:通过 expiresCache-Control 头实现浏览器缓存,减少重复请求
  • 服务器压力小:处理速度快,并发能力强
  • 配置简单:只需配置 image_filter 模块,无需复杂的缓存配置

编译Nginx时启用模块

bash
# 检查是否已安装
nginx -V 2>&1 | grep -o with-http_image_filter_module

# 如果未安装,重新编译
./configure --with-http_image_filter_module
make && make install

Nginx配置

重要说明

  1. image_filter 模块直接处理本地文件,不是代理模式,因此不能直接使用 proxy_cache
  2. image_filter 指令不能在 if 块内使用,必须在 location 块内直接使用
  3. 需要使用内部 location 来分离有参数和无参数的处理
完整配置方案(推荐,包含安全防护)

适合生产环境,包含路径遍历防护和参数验证:

nginx
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/html/public;
    
    # 图片处理入口(必须放在 location / 之前)
    location ~* ^/(uploads|attachment)/.+\.(jpg|jpeg|png|gif|webp)$ {
        # 防止路径遍历(安全防护)
        if ($uri ~ "\.\.") {
            return 403;
        }
        
        # 参数验证(验证 w、h 为数字)
        set $valid 0;
        if ($arg_w) {
            set $valid 1;
        }
        if ($arg_w ~ "^[1-9][0-9]*$") {
            set $valid "${valid}1";
        }
        if ($arg_h ~ "^[1-9][0-9]*$") {
            set $valid "${valid}1";
        }
        
        # 如果参数有效,重写到内部 location
        if ($valid = "111") {
            rewrite ^/(uploads|attachment)/(.+)$ /thumb/$1/$2?$args last;
        }
        
        # 没有参数,直接返回原图
        try_files $uri =404;
        expires 30d;
        add_header Cache-Control "public";
    }

    # 内部 location:处理缩略图(不要使用 if)
    location ~* ^/thumb/(uploads|attachment)/(.+)$ {
        internal;  # 关键:只能内部访问,外部无法直接访问
        
        # 使用 image_filter 处理
        image_filter resize $arg_w $arg_h;
        image_filter_jpeg_quality $arg_q;
        image_filter_buffer 20M;
        
        # 读取原图文件(去掉 /thumb 前缀,读取真实文件)
        alias /var/www/html/public/$1/$2;
        
        expires 7d;
        add_header Cache-Control "public, immutable";
    }
    
    # ThinkPHP 路由重写(示例)
    location / {
        if (!-e $request_filename) {
            rewrite  ^(.*)$  /index.php?s=/$1  last;
            break;
        }
    }
}
配置说明

工作原理

  1. 用户访问:/attachment/image.jpg?w=300&h=300
  2. 第一个 location 匹配,检测到有 w 参数
  3. rewrite 将请求内部重写为:/thumb/attachment/image.jpg?w=300&h=300
  4. 第二个 location(internal)处理这个虚拟路径
  5. alias 指令将 /thumb/attachment/image.jpg 映射到真实文件
  6. image_filter 处理图片并返回

安全措施

  1. 路径遍历防护if ($uri ~ "\.\.") 防止 ../ 攻击
  2. 参数验证:验证 wh 参数为数字(1-9999)
  3. 内部 location 保护internal 关键字防止外部直接访问
  4. 目录限制:只允许 uploadsattachment 目录

重要提示

  • /thumb/ 是虚拟路径,不需要真实目录存在
  • internal 关键字确保只能通过内部 rewrite 访问
  • 所有 if 检查必须在第一个 location 中完成
  • 内部 location 中不能使用 if 指令
宝塔面板部署步骤
  1. 检查 image_filter 模块

    bash
    # SSH 登录服务器,执行
    nginx -V 2>&1 | grep image_filter

    如果输出包含 --with-http_image_filter_module,说明已安装。

  2. 编辑站点配置

    • 登录宝塔面板
    • 进入 网站 → 选择你的站点 → 设置
    • 点击 配置文件 标签页
    • #禁止在证书验证目录放入敏感文件 之后添加图片处理配置
  3. 配置位置

    • 图片处理 location 必须放在通用图片 location(location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$)之前
    • 确保优先匹配图片文件
  4. 完整配置示例(宝塔面板)

    nginx
    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }
    
    # 图片处理入口(必须放在通用图片 location 之前)
    location ~* ^/(uploads|attachment)/.+\.(jpg|jpeg|png|gif|webp)$ {
        # 防止路径遍历
        if ($uri ~ "\.\.") {
            return 403;
        }
        
        # 参数验证(验证 w、h 为数字)
        set $valid 0;
        if ($arg_w) {
            set $valid 1;
        }
        if ($arg_w ~ "^[1-9][0-9]*$") {
            set $valid "${valid}1";
        }
        if ($arg_h ~ "^[1-9][0-9]*$") {
            set $valid "${valid}1";
        }
        
        # 如果参数有效,重写到内部 location
        if ($valid = "111") {
            rewrite ^/(uploads|attachment)/(.+)$ /thumb/$1/$2?$args last;
        }
        
        # 没有参数,直接返回原图
        try_files $uri =404;
        expires 30d;
        add_header Cache-Control "public";
    }
    
    # 内部 location:处理缩略图
    location ~* ^/thumb/(uploads|attachment)/(.+)$ {
        internal;
        
        image_filter resize $arg_w $arg_h;
        image_filter_jpeg_quality $arg_q;
        image_filter_buffer 20M;
        
        # 注意:修改为你的实际项目路径
        alias /home/wwwroot/your-domain.com/public/$1/$2;
        
        expires 7d;
        add_header Cache-Control "public, immutable";
    }
    
    # 通用图片缓存(其他图片文件)
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }
  5. 保存并测试

    • 点击 保存 按钮
    • 点击 测试配置 检查语法
    • 如果测试通过,点击 重载配置 或重启 Nginx
  6. 测试验证

    bash
    # 测试配置
    nginx -t
    
    # 如果通过,重载配置
    nginx -s reload

    然后测试以下 URL:

    • 原图:https://your-domain.com/attachment/image.jpg
    • 缩略图:https://your-domain.com/attachment/image.jpg?w=300&h=300

URL格式

# 基础缩略图
https://your-domain.com/uploads/image.jpg?w=200&h=200
https://your-domain.com/attachment/image.jpg?w=200&h=200

# 缩略图 + 质量优化
https://your-domain.com/uploads/image.jpg?w=200&h=200&q=85
https://your-domain.com/attachment/image.jpg?w=200&h=200&q=85

# 只指定宽度(高度使用相同值,Nginx 会按比例缩放)
https://your-domain.com/uploads/image.jpg?w=400

# 只指定高度(宽度使用相同值,Nginx 会按比例缩放)
https://your-domain.com/uploads/image.jpg?h=300

# 原图访问(无参数)
https://your-domain.com/uploads/image.jpg
https://your-domain.com/attachment/image.jpg

参数说明

  • w: 宽度(像素,必须为数字,范围 1-9999)
  • h: 高度(像素,必须为数字,范围 1-9999)
  • q: 图片质量 1-100(可选,只对 JPEG 格式有效)

注意

  • Nginx image_filterresize 需要同时指定宽高
  • 如果只指定宽度或高度,前端会自动设置相同的值,Nginx 会按比例缩放
  • 质量参数只对 JPEG 格式有效
  • 参数必须为数字,非数字参数会返回 400 错误

性能优化建议

  1. 浏览器缓存:使用 expiresCache-Control 头,建议缩略图缓存7天,原图缓存30天
  2. 限制缓冲区大小image_filter_buffer 根据服务器内存设置,建议 10M-20M
  3. CDN加速:将处理后的图片通过CDN加速,进一步提升性能
  4. 服务器端缓存:如需服务器端缓存,建议使用云存储服务(OSS/COS/七牛云),自动支持缓存功能

配置注意事项

  1. image_filter 限制

    • image_filter 指令不能在 if 块内使用,必须在 location 块内直接使用
    • 需要使用内部 location 来分离有参数和无参数的处理
    • resize 需要同时指定宽高,不支持只指定一个维度
  2. 安全配置

    • 必须添加路径遍历防护:if ($uri ~ "\.\.")
    • 建议添加参数验证,确保参数为数字(1-9999)
    • 使用 internal 关键字保护内部 location
  3. 模块检查:使用前确保 Nginx 已编译 image_filter 模块:

    bash
    nginx -V 2>&1 | grep image_filter
  4. 路径配置

    • 图片处理 location 必须放在 location / 之前,确保优先匹配
    • alias 路径必须与 root 路径对应
    • 确保 Nginx 用户有读取图片文件的权限
  5. 参数验证说明

    • wh 参数必须验证为数字,防止无效值和资源消耗攻击
    • q 参数验证可在应用层处理(前端或后端),更灵活
    • image_filter_jpeg_quality 会自动处理无效值,但建议在应用层验证

常见问题

Q: 为什么不能直接在 location 中使用 if 判断参数? A: 因为 image_filter 指令不能在 if 块内使用,必须使用内部 location 方案。

Q: /thumb/ 目录需要创建吗? A: 不需要,/thumb/ 是虚拟路径,通过 internalalias 处理,不会真正访问该目录。

Q: 如果原图小于请求的尺寸会怎样? A: Nginx image_filter 只缩小不放大,如果原图小于请求尺寸,会返回原图大小。

Q: 如何限制最大尺寸? A: 可以在第一个 location 中添加参数范围验证(使用正则表达式限制范围),或在前端应用层限制。

Q: 质量参数 q 需要验证吗? A: 建议在应用层验证(前端或后端),因为 Nginx 的 if 嵌套限制,在 Nginx 中验证可能较复杂。image_filter_jpeg_quality 会自动处理无效值。

前端使用指南

基础用法

typescript
import { formatImageUrl } from '@/utils/image'

// 基础用法(不生成缩略图,使用原图)
const imageUrl = formatImageUrl('/path/to/image.jpg')

// 生成缩略图(指定宽高,使用默认 imageType)
const thumbnail = formatImageUrl('/path/to/image.jpg', {
  width: 200,
  height: 200
})

// 只指定宽度,高度自动按比例缩放(使用默认 imageType)
const widthOnly = formatImageUrl('/path/to/image.jpg', {
  width: 400
})

// 只指定高度,宽度自动按比例缩放(使用默认 imageType)
const heightOnly = formatImageUrl('/path/to/image.jpg', {
  height: 300
})

// 使用原图,只优化质量和格式(使用默认 imageType)
const optimized = formatImageUrl('/path/to/image.jpg', {
  useOriginal: true,
  format: 'webp',
  quality: 85
})

使用预设配置

项目提供了基础的预设配置,可根据实际需求使用或自定义:

typescript
import { formatImageUrl, ThumbnailPresets } from '@/utils/image'

// 预设配置说明
// - small: 小缩略图(100x100),适用于头像、图标等小尺寸场景
// - compact: 紧凑型缩略图(200x200),适用于Logo、品牌标识等
// - medium: 中等缩略图(360x360),适用于列表页、卡片等场景(符合京东等主流平台标准)
// - large: 大缩略图(750x750),适用于详情页、预览等场景(符合移动端主流标准)
// - original: 原图(不缩放),只优化质量和格式,适用于详情页大图

// 使用预设(使用默认 imageType)
const small = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.small)    // 100x100
const compact = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.compact) // 200x200(Logo标准)
const medium = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.medium)  // 360x360(列表页标准)
const large = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.large)    // 750x750(详情页标准)
const original = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.original) // 原图

// 自定义尺寸示例(使用默认 imageType)
// 列表页:使用 medium(360x360)或自定义 { width: 360, height: 360 }
const list = formatImageUrl('/path/to/image.jpg', { width: 360, height: 360 })

// 详情页:使用 large(750x750)或自定义 { width: 750, height: 750 }
const detail = formatImageUrl('/path/to/image.jpg', { width: 750, height: 750 })

// 头像:使用 small 或自定义 { width: 80, height: 80, mode: 'fixed' }
const avatar = formatImageUrl('/path/to/image.jpg', { width: 80, height: 80, mode: 'fixed' })

// 店铺Logo:使用 compact(200x200)或自定义 { width: 200, height: 200, mode: 'fixed' }
const storeLogo = formatImageUrl('/path/to/image.jpg', { width: 200, height: 200, mode: 'fixed' })

// 指定图片类型(当需要特定默认图片时)
const goodsImage = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.medium, 'goods')
const storeLogoImage = formatImageUrl('/path/to/image.jpg', ThumbnailPresets.compact, 'store_logo')

在Vue组件中使用

vue
<template>
  <!-- 列表页使用缩略图(使用预设,指定图片类型) -->
  <image 
    :src="formatImageUrl(goods.cover_image, ThumbnailPresets.medium, 'goods')" 
    mode="aspectFill"
  />
  <!-- 或自定义尺寸,指定图片类型 -->
  <image 
    :src="formatImageUrl(goods.cover_image, { width: 300, height: 300 }, 'goods')" 
    mode="aspectFill"
  />
  
  <!-- 详情页使用大图(指定图片类型) -->
  <image 
    :src="formatImageUrl(goods.cover_image, ThumbnailPresets.large, 'goods')" 
    mode="aspectFit"
  />
  <!-- 或使用原图(只优化质量和格式,指定图片类型) -->
  <image 
    :src="formatImageUrl(goods.cover_image, ThumbnailPresets.original, 'goods')" 
    mode="aspectFit"
  />
  
  <!-- 店铺Logo(使用预设,指定图片类型) -->
  <image 
    :src="formatImageUrl(store.store_logo, ThumbnailPresets.compact, 'store_logo')" 
    mode="aspectFill"
  />
  <!-- 或自定义固定尺寸,指定图片类型 -->
  <image 
    :src="formatImageUrl(store.store_logo, { width: 200, height: 200, mode: 'fixed' }, 'store_logo')" 
    mode="aspectFill"
  />
  
  <!-- 头像(使用预设,指定图片类型) -->
  <image 
    :src="formatImageUrl(user.avatar, ThumbnailPresets.small, 'avatar')" 
    mode="aspectFill"
  />
  <!-- 或自定义固定尺寸,指定图片类型 -->
  <image 
    :src="formatImageUrl(user.avatar, { width: 80, height: 80, mode: 'fixed' }, 'avatar')" 
    mode="aspectFill"
  />
</template>

<script setup lang="ts">
import { formatImageUrl, ThumbnailPresets } from '@/utils/image'

// 组件代码...
</script>

优化建议

1. 使用WebP格式(推荐)

WebP格式体积比JPEG小30-50%,加载速度更快:

typescript
const webpThumbnail = formatImageUrl('/path/to/image.jpg', {
  width: 200,
  height: 200,
  format: 'webp',
  quality: 85
})

2. 合理设置质量参数

  • 列表页:质量70-80,平衡体积和清晰度
  • 详情页:质量85-95,保证清晰度
  • 缩略图:质量70-80即可

3. 根据场景选择尺寸

  • 列表页:200x200 或 300x300
  • 详情页:400x400 或 600x600
  • 头像:80x80 或 100x100
  • Banner:750x300 或根据设计稿

4. 同比例缩放

只指定宽度或高度时,系统会自动按比例缩放,保持图片不变形:

typescript
// 只指定宽度,高度自动按比例(使用默认 imageType)
formatImageUrl('/path/to/image.jpg', { width: 400 })

// 只指定高度,宽度自动按比例(使用默认 imageType)
formatImageUrl('/path/to/image.jpg', { height: 300 })

5. 使用原图优化

如果不需要缩放,只需要优化质量和格式,使用 useOriginal 选项:

typescript
// 使用原图,只优化质量和格式(使用默认 imageType)
formatImageUrl('/path/to/image.jpg', {
  useOriginal: true,
  format: 'webp',
  quality: 85
})

性能优化

1. CDN加速

所有云存储服务都支持CDN加速,建议配置:

  • 阿里云OSS:配置CDN加速域名
  • 腾讯云COS:配置CDN加速域名
  • 七牛云:配置CDN加速域名
  • 本地存储:配置CDN或使用Nginx缓存

2. 缓存策略

  • 浏览器缓存:设置合适的 Cache-Control 头,建议缩略图7天,原图30天
  • CDN缓存:配置CDN缓存规则,进一步提升性能
  • Nginx缓存image_filter 模块直接处理文件,主要依赖浏览器缓存。如需服务器端缓存,建议使用云存储服务(OSS/COS/七牛云)

3. 图片格式优化

  • 优先使用WebP:体积小,加载快
  • 渐进式JPEG:提升用户体验
  • 合理压缩:平衡体积和清晰度

4. 懒加载

在列表页使用图片懒加载,减少首屏加载时间:

vue
<image 
  :src="formatImageUrl(item.cover_image, ThumbnailPresets.medium, 'goods')" 
  mode="aspectFill"
  lazy-load
/>

最佳实践

1. 存储类型选择

  • 小规模项目:使用本地存储 + Nginx处理
  • 中大规模项目:使用阿里云OSS或腾讯云COS
  • 高并发场景:使用云存储 + CDN加速

2. 缩略图尺寸规范

建议统一使用以下尺寸(符合主流电商平台标准):

  • 小缩略图:100x100(头像、图标)- 使用 ThumbnailPresets.small
  • 紧凑型缩略图:200x200(Logo、品牌标识)- 使用 ThumbnailPresets.compact
  • 中等缩略图:360x360(列表、卡片)- 使用 ThumbnailPresets.medium(符合京东标准)
  • 大缩略图:750x750(详情、预览)- 使用 ThumbnailPresets.large(符合淘宝/天猫/拼多多标准)
  • 原图优化:不缩放,只优化质量和格式 - 使用 ThumbnailPresets.original
  • 自定义尺寸:根据实际需求自定义,如列表页 360x360、详情页 750x750 等

尺寸标准说明

  • 200px:Logo、品牌标识标准尺寸
  • 360px:移动端列表页标准尺寸,兼顾清晰度和加载速度(京东标准)
  • 750px:移动端详情页标准尺寸,适配主流屏幕宽度(淘宝/天猫/拼多多标准)

3. 质量参数设置

  • 缩略图:70-80(体积小,加载快)
  • 详情图:85-95(清晰度高)
  • Banner图:80-90(平衡体积和清晰度)

4. 格式选择

  • 照片类:JPEG(体积小)
  • 图标类:PNG(支持透明)
  • 现代浏览器:WebP(体积最小)

5. 错误处理

typescript
// 空URL自动返回默认图片(指定图片类型)
const imageUrl = formatImageUrl('', undefined, 'goods') // 返回默认商品图片

// 在组件中处理加载失败(指定图片类型)
<image 
  :src="formatImageUrl(goods.cover_image, undefined, 'goods')" 
  @error="handleImageError"
  mode="aspectFill"
/>

常见问题

1. 为什么必须通过环境变量配置存储类型?

因为云存储服务支持自定义域名,无法通过URL判断存储类型。强制使用环境变量配置可以:

  • 避免误判
  • 支持自定义域名
  • 配置更明确可靠

2. 本地存储如何支持缩略图?

当存储类型配置为 local 时,系统会自动添加Nginx URL参数(?w=200&h=200)。如果配置了Nginx image_filter 模块,会自动处理缩略图;如果没有配置,参数会被忽略,仍可正常访问原图。建议:

  • 配置Nginx image_filter 模块以支持缩略图处理
  • 或使用云存储服务(自动支持缩略图)

3. 如何选择存储方案?

  • 性能优先:阿里云OSS + CDN
  • 成本优先:本地存储 + Nginx
  • 功能丰富:阿里云OSS(功能最全)
  • 简单易用:Nginx image_filter

4. 缩略图会影响原图吗?

不会。缩略图通过URL参数按需生成,不会修改原图。原图始终保存在存储服务中。

5. 如何优化图片加载速度?

  1. 使用WebP格式
  2. 合理设置质量参数
  3. 配置CDN加速
  4. 启用浏览器缓存
  5. 使用图片懒加载

配置检查清单

环境变量检查

  • [ ] VITE_FILE_TYPE 已正确配置
  • [ ] VITE_FILE_BASE_URL 已正确配置
  • [ ] 开发环境和生产环境配置正确

Nginx配置检查(如使用本地存储)

  • [ ] image_filter 模块已启用(如需要缩略图功能)
  • [ ] 图片处理 location 配置正确,放在 location / 之前
  • [ ] 路径遍历防护已配置(if ($uri ~ "\.\.")
  • [ ] 参数验证已配置(验证 wh 为数字)
  • [ ] 内部 location 配置正确(internal 关键字)
  • [ ] alias 路径配置正确(与 root 路径对应)
  • [ ] 浏览器缓存头配置正确(expiresCache-Control
  • [ ] 测试URL参数是否生效(?w=200&h=200
  • [ ] 测试原图访问是否正常(无参数)
  • [ ] 测试路径遍历防护(?w=200&h=200&../../../etc/passwd 应返回 403)
  • [ ] 测试参数验证(?w=abc&h=def 应返回 400 或原图)

云存储配置检查

  • [ ] AccessKey配置正确
  • [ ] Bucket配置正确
  • [ ] CDN加速已配置(可选)
  • [ ] 跨域配置正确

总结

DSPlatform 的图片处理方案具有以下优势:

  1. 按需生成:无需预先生成缩略图,节省存储空间
  2. 性能优秀:云存储服务处理速度快,支持CDN加速
  3. 配置简单:通过环境变量统一配置
  4. 灵活扩展:支持多种存储类型,易于切换
  5. 成本可控:按需生成,不占用额外存储

选择合适的存储方案,合理设置缩略图参数,可以显著提升系统性能和用户体验。


最后更新:2024-01-20
维护者:DSPlatform技术团队(德尚网络)

获取帮助

如果您在使用过程中遇到问题,可以通过以下方式获取帮助:

  • 官方网站https://www.csdeshang.com
  • 电话咨询:15364080101(微信同号)
  • QQ咨询:858761000
  • 邮箱咨询:858761000@qq.com
  • 工作时间:工作日 9:00-18:00
  • 微信咨询:扫码添加微信
微信二维码

版权所有 © 2014-至今 德尚网络