Skip to content

图片处理解决方案 ​

概述 ​

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 原样返回 | 云存储追加缩略图参数 → 浏览器请求资源

核心原则 ​

  1. 强制配置:必须通过环境变量 VITE_FILE_TYPE 配置存储类型(Nuxt 见 runtimeConfig.public)
  2. 不支持URL判断:由于 OSS 等支持自定义域名,不能仅靠 URL 推断存储类型
  3. 统一接口:前端使用统一的 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:渐进式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. 本地存储(local) ​

当前前端实现(默认,与代码一致) ​

  • 当 VITE_FILE_TYPE=local 时,processImageUrl 不修改 URL,不拼接 ?w=、?h=、q、format 等查询参数,避免依赖 Nginx image_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. 如何优化图片加载速度? ​

  1. 云存储:使用 WebP、质量参数、CDN、缓存与懒加载(见上文)
  2. local:压缩原图、合理宽高、CDN/静态缓存;列表大图多时优先考虑云存储

配置检查清单 ​

环境变量检查 ​

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

静态站点(local) ​

  • [ ] attachment(或实际附件目录)可被 Web 服务器直接访问(权限、MIME、root/alias 或等价规则正确)
  • [ ] 生产环境为静态资源设置合理的 Cache-Control / expires(可选)

云存储配置检查 ​

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

总结 ​

  1. local:前端输出 原图 URL,依赖附件域名与静态资源可访问;展示尺寸由 UI 控制。
  2. 云存储:按需 URL 处理(缩略图/WebP 等),节省流量与存储。
  3. 多端:同一套 formatImageUrl / processImageUrl,环境变量配置入口因框架而异(见上文表格)。

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


最后更新:2026-05-06
维护者:DSMall Pro技术团队(德尚网络)

获取帮助 ​

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

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

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