# 前端图片 URL 使用指南
## 概述
后端已优化图片访问方式,现在支持通过 Nginx 静态资源直接访问图片,提高了图片加载效率。
## 图片数据结构
### 聊天消息中的图片
```json
{
"images": [
{
"id": "abc123",
"url": "/files/img/abc123.jpg",
"type": "image",
"source": "文档名.pdf",
"page": 1,
"description": "图片描述"
}
]
}
```
## URL 格式说明
### 两种 URL 格式
后端会返回以下两种格式的 URL:
1. **新格式(推荐):`/files/img/xxx.jpg` - 通过 Nginx 静态资源访问
2. **旧格式(兼容)**:`/api/image/xxx/data` - 通过后端 API 代理访问
## 前端适配说明
### 无需修改的情况
如果您的前端目前使用如下方式处理图片,则无需修改代码:
```javascript
// 直接使用后端返回的 URL
```
### 推荐的处理方式
```javascript
// 通用图片加载器
function loadImage(imageData) {
const imageUrl = imageData.url;
// 直接使用后端返回的 URL
const img = document.createElement('img');
img.src = imageUrl;
img.alt = imageData.description || '图片';
img.onerror = function() {
// 图片加载失败时的处理
console.error('图片加载失败:', imageUrl);
};
return img;
}
```
### 检查 URL 类型
```javascript
function isNginxUrl(url) {
return url && url.startsWith('/files/');
}
function isApiUrl(url) {
return url && url.includes('/api/image/');
}
```
## SSE 流处理示例
### JavaScript 示例
```javascript
const eventSource = new EventSource('/api/chat/stream');
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
if (data.type === 'finish') {
// 处理图片
if (data.images && data.images.length > 0) {
renderImages(data.images);
}
}
};
function renderImages(images) {
const container = document.getElementById('image-container');
images.forEach(image => {
const img = document.createElement('img');
img.src = image.url;
img.alt = image.description || '图片';
img.style.maxWidth = '100%';
container.appendChild(img);
// 显示图片描述
if (image.description) {
const desc = document.createElement('p');
desc.textContent = image.description;
container.appendChild(desc);
}
});
}
```
### React 示例
```jsx
function ChatImages({ images }) {
return (