Appearance
图片处理解决方案
概述
DSMall Pro 支持多种图片存储与访问地址拼装:本地存储(local)、阿里云 OSS、腾讯云 COS、七牛云。通过环境变量 VITE_FILE_TYPE 区分存储类型;云存储下前端会为 URL 追加各厂商的缩略图/处理参数(按需生成、不占额外存储);local 下前端只拼接原图地址,不追加任何缩略图查询参数,避免依赖 Nginx image_filter 等站点配置。文档中不再提供 Nginx 示例片段,按需缩放请参考云存储或自行查阅 Nginx 官方文档。
核心特性
- 按需生成(云存储):OSS/COS/七牛通过 URL 参数按需处理,无需预生成多张缩略图
- 节省存储:业务侧只持久化原图路径或对象键
- local 简化:原图 URL 直出,列表/头像展示由前端组件控制尺寸与裁剪
- 性能优化:云存储可配合 CDN;本地可配合静态缓存 Header
- 灵活配置:通过环境变量统一配置存储类型与附件域名
- 多端一致:
vue-element-admin、nuxt-consumer、uniapp共用同一套formatImageUrl/processImageUrl逻辑(仅ThumbnailPresets尺寸在 PC 与移动端不同)
支持的存储类型
系统支持以下存储类型:
- local: 本地存储(前端 不追加
w/h等参数;使用 原图 URL) - aliyun: 阿里云 OSS(URL 参数缩略图/处理)
- tencent: 腾讯云 COS(URL 参数缩略图)
- qiniu: 七牛云(URL 参数缩略图)
技术架构
前端架构
下列文件逻辑保持一致(注释头中有同步说明):
vue-element-admin/src/utils/image.ts
nuxt-consumer/app/utils/image.ts
uniapp/src/utils/image.ts
├── formatImageUrl() # 主入口:拼域名、空地址默认图、按需调用 processImageUrl
├── processImageUrl() # local 直接返回 URL;云存储追加厂商参数
├── addOssThumbnail()
├── addCosThumbnail()
└── addQiniuThumbnail()处理流程
后端上传 → 返回相对路径或完整 URL → 前端 formatImageUrl 拼接 VITE_FILE_BASE_URL(相对路径时)
→ processImageUrl:local 原样返回 | 云存储追加缩略图参数 → 浏览器请求资源核心原则
- 强制配置:必须通过环境变量
VITE_FILE_TYPE配置存储类型(Nuxt 见runtimeConfig.public) - 不支持URL判断:由于 OSS 等支持自定义域名,不能仅靠 URL 推断存储类型
- 统一接口:前端使用统一的
formatImageUrl()处理展示用图片地址
后端(PHP)职责说明
- 上传接口通常返回 相对路径(如
attachment/...)或业务字段中仅存路径;不负责拼接前端VITE_FILE_BASE_URL,也不实现 Nginx 缩略图参数。 - 附件实际存储方式(local / aliyun 等)由后端存储配置决定;前端
VITE_FILE_TYPE须与实际对外访问方式一致(例如均为本地静态目录或均为 OSS 域名),否则会出现部分 URL 无法访问。
环境变量配置
前端环境变量
在 .env.development 和 .env.production 中配置:
env
# 文件存储类型:local | aliyun | tencent | qiniu
VITE_FILE_TYPE=aliyun
# 文件上传地址(本地存储时使用,云存储时可为空或填写CDN地址)
VITE_FILE_BASE_URL=https://your-domain.com多端如何配置同一组变量
| 端 | 配置位置 |
|---|---|
| vue-element-admin(后台 PC) | 项目根目录 .env.development / .env.production |
| uni-app | 项目根目录 .env.development / .env.production |
| nuxt-consumer(PC 商城等) | nuxt.config.ts → runtimeConfig.public 中的 VITE_FILE_TYPE、VITE_FILE_BASE_URL(需重启 dev/build) |
三端代码均读取同名 VITE_FILE_TYPE、VITE_FILE_BASE_URL(Nuxt 通过 useRuntimeConfig().public 读取)。
配置示例
开发环境(本地存储)
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生产环境(本地存储)
附件通过站点或 CDN 提供静态访问即可;不要求为前端单独开启 Nginx 缩略图参数。
env
VITE_FILE_TYPE=local
VITE_FILE_BASE_URL=https://your-domain.com缩略图处理方案
下列 第 1~3 节(阿里云 / 腾讯 / 七牛)仅在 VITE_FILE_TYPE 与之一致 且传入 formatImageUrl 的缩略图选项时,才会体现在最终 URL 上。local 见上文第 4 节,不使用本节厂商参数。
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:渐进式JPEGimage/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/webp3. 七牛云缩略图
七牛云支持通过URL参数 imageView2 进行图片处理,格式与腾讯云COS类似。
URL格式
https://bucket.qiniucdn.com/path/to/image.jpg?imageView2/2/w/200/h/200参数说明
与腾讯云COS相同,使用 imageView2 参数。
4. 本地存储(local)
当前前端实现(默认,与代码一致)
- 当
VITE_FILE_TYPE=local时,processImageUrl不修改 URL,不拼接?w=、?h=、q、format等查询参数,避免依赖 Nginximage_filter、rewrite 与参数校验,减少环境差异导致的显示问题。 - 业务代码仍可写
formatImageUrl(path, ThumbnailPresets.medium);在 local 下结果与 仅原图 的formatImageUrl(path)等价(展示尺寸由el-image宽高、CSS、mode等控制)。 - 阿里云 / 腾讯 / 七牛:仍会追加对应厂商 URL 处理参数,行为不变。
源码:vue-element-admin/src/utils/image.ts、nuxt-consumer/app/utils/image.ts、uniapp/src/utils/image.ts(ThumbnailPresets:uniapp 为小尺寸,PC 端为大尺寸,见各文件底部常量)。
关于 Nginx
默认不需要:当前 DSMall Pro 前端在 local 下不会请求带 ?w=、?h= 等缩略图参数的地址。部署本地附件时,只需保证 attachment(或实际静态目录)可被 Web 服务器正常访问(MIME、权限、静态路由等常规配置即可)。
若因其它业务(第三方链接、自建网关、历史约定)仍需使用 ngx_http_image_filter_module 等能力,请自行查阅 Nginx 官方文档:ngx_http_image_filter_module 编写配置。本文不再收录 Nginx 示例配置,以免与默认产品行为混淆。
前端使用指南
local 与云存储:下列
formatImageUrl的缩略图/WebP 等选项在VITE_FILE_TYPE为 aliyun / tencent / qiniu 时才会反映到最终 URL;local 下processImageUrl直接返回原图地址,不附加处理参数(展示效果依赖组件与样式)。
基础用法
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
})使用预设配置
ThumbnailPresets 在 uniapp 与 PC 端(vue-element-admin / nuxt-consumer) 中数值不同:移动端多为 100/360/750 等,PC 端多为 150/500/1200 等,以各仓库 image.ts 中常量为准。以下示例以通用写法说明;在 local 下这些预设不会改变最终 URL(仍见上文说明)。
项目提供了基础的预设配置,可根据实际需求使用或自定义:
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格式(云存储更推荐)
在 OSS/COS/七牛 下,WebP 会体现在 URL 处理参数中。local 下不会追加 format,是否使用 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加速域名
- 本地存储:静态资源域名与缓存 Header;列表大图多时优先考虑云存储或压缩原图
2. 缓存策略
- 浏览器缓存:设置合适的
Cache-Control头;云存储缩略图与 CDN 可按厂商建议设置 TTL - CDN缓存:配置CDN缓存规则,进一步提升性能
- 本地 static:依赖 Web 服务器常规静态缓存即可(无需为前端单独配置图片查询参数)
3. 图片格式优化
- 优先使用WebP:体积小,加载快
- 渐进式JPEG:提升用户体验
- 合理压缩:平衡体积和清晰度
4. 懒加载
在列表页使用图片懒加载,减少首屏加载时间:
vue
<image
:src="formatImageUrl(item.cover_image, ThumbnailPresets.medium, 'goods')"
mode="aspectFill"
lazy-load
/>最佳实践
1. 存储类型选择
- 小规模项目:本地存储(
local+ 原图 URL)或 云存储 - 中大规模项目:阿里云 OSS 或 腾讯云 COS
- 高并发场景:云存储 + CDN 加速
2. 错误处理
typescript
// 空URL自动返回默认图片(指定图片类型)
const imageUrl = formatImageUrl('', undefined, 'goods') // 返回默认商品图片
// 在组件中处理加载失败(指定图片类型)
<image
:src="formatImageUrl(goods.cover_image, undefined, 'goods')"
@error="handleImageError"
mode="aspectFill"
/>常见问题
1. 为什么必须通过环境变量配置存储类型?
因为云存储服务支持自定义域名,无法通过URL判断存储类型。强制使用环境变量配置可以:
- 避免误判
- 支持自定义域名
- 配置更明确可靠
2. 本地存储还有缩略图吗?
当前默认实现:VITE_FILE_TYPE=local 时,前端 不会在 URL 上添加任何缩略图查询参数,始终请求原图地址。若需要云侧按需缩放,请使用 aliyun / tencent / qiniu 并正确配置 VITE_FILE_BASE_URL 与存储。若仅本地部署,可通过页面组件控制显示尺寸;网关侧自建图片处理与默认前端无联动。
3. 如何选择存储方案?
- 性能优先:阿里云OSS + CDN
- 成本优先:本地存储(原图 + 组件缩放)
- 功能丰富:阿里云OSS(能力最全)
- 云侧按需缩略图:阿里云 / 腾讯 / 七牛 + 正确配置
VITE_FILE_TYPE
4. 缩略图会影响原图吗?
云存储:处理参数只影响当前请求的响应,不修改 Bucket 中的原对象。本地存储:前端请求的是静态原文件路径,同样不会在服务器上改写原图文件。
5. 如何优化图片加载速度?
- 云存储:使用 WebP、质量参数、CDN、缓存与懒加载(见上文)
- local:压缩原图、合理宽高、CDN/静态缓存;列表大图多时优先考虑云存储
配置检查清单
环境变量检查
- [ ]
VITE_FILE_TYPE已正确配置 - [ ]
VITE_FILE_BASE_URL已正确配置 - [ ] 开发环境和生产环境配置正确
静态站点(local)
- [ ]
attachment(或实际附件目录)可被 Web 服务器直接访问(权限、MIME、root/alias或等价规则正确) - [ ] 生产环境为静态资源设置合理的
Cache-Control/expires(可选)
云存储配置检查
- [ ] AccessKey配置正确
- [ ] Bucket配置正确
- [ ] CDN加速已配置(可选)
- [ ] 跨域配置正确
总结
- local:前端输出 原图 URL,依赖附件域名与静态资源可访问;展示尺寸由 UI 控制。
- 云存储:按需 URL 处理(缩略图/WebP 等),节省流量与存储。
- 多端:同一套
formatImageUrl/processImageUrl,环境变量配置入口因框架而异(见上文表格)。
选择合适的存储方案,合理设置缩略图参数(云存储),可以显著提升系统性能和用户体验。
最后更新:2026-05-06
维护者:DSMall Pro技术团队(德尚网络)
获取帮助
如果您在使用过程中遇到问题,可以通过以下方式获取帮助:
- 官方网站:https://www.csdeshang.com
- 电话咨询:15364080101(微信同号)
- QQ咨询:858761000
- 邮箱咨询:858761000@qq.com
- 工作时间:工作日 9:00-18:00
- 微信咨询:扫码添加微信

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