# 文件 URL 使用指南
## 概述
后端文件上传后会返回文件元数据,前端需要将文件路径转换为可访问的 URL。
## 后端返回的数据格式
```javascript
{
fileId: "1234567890", // 文件唯一ID(必需,用于访问文件)
filePath: "tenant-logo/2025/12/10/a111492084ab4a5fb3f149f76b5f8c4c.png", // 文件存储路径(仅用于记录)
accessUrl: "http://example.com/uploads/...", // 可选:直接访问URL
originalName: "logo.png",
fileSize: 12345,
// ... 其他字段
}
```
**重要**: 前端必须使用 `fileId` 来访问文件,`filePath` 仅用于后端存储,无法直接访问。
## 使用方法
### 1. 导入工具函数
```javascript
import { getFileDownloadUrl, getFileUrl, getImageUrl } from '@/utils'
```
### 2. 获取文件访问 URL
#### 方式一:传入完整的文件元数据对象
```javascript
const fileData = {
fileId: '1234567890',
filePath: 'tenant-logo/2025/12/10/xxx.png',
accessUrl: 'http://example.com/uploads/xxx.png'
}
const url = getFileUrl(fileData)
// 优先级: accessUrl > filePath > fileId
```
#### 方式二:传入文件 ID 字符串(推荐)
```javascript
const fileId = '1234567890'
const url = getFileUrl(fileId)
// 结果: /dev-api/api/file/download/1234567890
```
**注意**: 不要直接传入 `filePath`,因为后端没有静态资源映射,无法通过路径访问文件。
### 3. 在模板中使用
#### 显示图片
```vue
```
#### 下载文件
```vue
下载文件
```
### 4. 获取缩略图 URL
```javascript
import { getImageUrl } from '@/utils'
// 基础用法
const url = getImageUrl(filePath)
// 指定尺寸
const thumbnailUrl = getImageUrl(filePath, {
width: 200,
height: 200,
mode: 'crop' // 'fit' | 'fill' | 'crop'
})
```
## API 说明
### getFileUrl(fileData)
获取文件访问 URL
**参数:**
- `fileData` - 文件路径字符串或文件元数据对象
- 字符串: `"tenant-logo/2025/12/10/xxx.png"` 或 `fileId`
- 对象: `{ fileId, filePath, accessUrl }`
**返回:** `string` - 完整的文件访问 URL
**优先级:**
1. 如果是对象,优先使用 `accessUrl`
2. 然后使用 `filePath`
3. 最后使用 `fileId`
### getFileDownloadUrl(fileId)
获取文件下载 URL
**参数:**
- `fileId` - 文件ID
**返回:** `string` - 文件下载 URL
### getImageUrl(filePath, options)
获取图片预览 URL(带缩略图参数)
**参数:**
- `filePath` - 文件路径
- `options` - 选项对象(可选)
- `width` - 宽度
- `height` - 高度
- `mode` - 缩放模式: `'fit'` | `'fill'` | `'crop'`
**返回:** `string` - 图片预览 URL
## 环境配置
文件 URL 会根据环境自动添加前缀:
- **开发环境** (`VITE_REQUEST_PREFIX=/dev-api`):
- 下载接口: `/dev-api/api/file/download/1234567890`
- **生产环境** (`VITE_REQUEST_PREFIX=/cbc-server`):
- 下载接口: `/cbc-server/api/file/download/1234567890`
## 注意事项
1. **必须使用 fileId**: 后端没有静态资源映射,所有文件访问必须通过 `fileId` 和下载接口
2. **上传组件自动处理**: 图片上传和文件上传组件会自动保存 `fileId` 并用于访问
3. **数据库存储**: 建议在数据库中存储 `fileId` 而不是 `filePath`
4. **跨域问题**: 如果文件服务器和应用服务器不在同一域名,需要配置 CORS
5. **完整 URL**: 如果后端返回的 `accessUrl` 是完整的 URL(包含 http/https),会直接使用,不会添加前缀
## 完整示例
```vue
下载文件
```