zhibo/模块文档/13-文件上传模块.md
2025-12-30 11:11:11 +08:00

240 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文件上传模块
## 模块概述
文件上传模块负责处理图片、视频等媒体文件的上传功能,为用户头像、作品发布、消息图片等功能提供支持。
## 相关文件
- `FileUploadResponse.java` - 文件上传响应模型
- `PublishWorkActivity.java` - 作品发布界面(使用文件上传)
- `EditProfileActivity.java` - 编辑资料界面(使用头像上传)
---
## 接口列表
### 1. 上传图片
**接口地址**: `POST /api/front/user/upload/image`
**请求方式**: `multipart/form-data`
**请求参数**:
```
file: File // 图片文件(必填)
model: string // 模块标识(必填)
pid: integer // 关联ID必填
```
**model参数说明**:
- `avatar` - 用户头像
- `work` - 作品图片
- `message` - 聊天图片
- `cover` - 封面图片
**返回数据** (FileUploadResponse):
```json
{
"code": 200,
"msg": "上传成功",
"data": {
"url": "string", // 文件访问URL
"fileName": "string", // 文件名
"fileSize": "long", // 文件大小(字节)
"fileType": "string", // 文件类型
"uploadTime": "long" // 上传时间戳
}
}
```
---
### 2. 上传视频
**接口地址**: `POST /api/front/upload/work/video`
**请求方式**: `multipart/form-data`
**请求参数**:
```
file: File // 视频文件(必填)
model: string // 模块标识(必填)
pid: integer // 关联ID必填
```
**model参数说明**:
- `work` - 作品视频
- `message` - 聊天视频
**返回数据** (FileUploadResponse):
```json
{
"code": 200,
"msg": "上传成功",
"data": {
"url": "string", // 文件访问URL
"fileName": "string", // 文件名
"fileSize": "long", // 文件大小(字节)
"fileType": "string", // 文件类型
"duration": "integer", // 视频时长(秒)
"width": "integer", // 视频宽度
"height": "integer", // 视频高度
"uploadTime": "long" // 上传时间戳
}
}
```
---
## 功能说明
### 支持的文件类型
**图片格式**:
- JPG/JPEG
- PNG
- GIF
- WEBP
**视频格式**:
- MP4
- AVI
- MOV
- FLV
### 文件大小限制
- 图片:最大 10MB
- 视频:最大 100MB
### 上传流程
1. 选择文件
2. 构建 multipart/form-data 请求
3. 调用上传接口
4. 获取返回的文件URL
5. 使用URL进行后续操作如发布作品、更新头像等
---
## 使用示例
### Android代码示例
#### 上传图片
```java
// 创建文件部分
File imageFile = new File(imagePath);
RequestBody fileBody = RequestBody.create(
MediaType.parse("image/*"),
imageFile
);
MultipartBody.Part filePart = MultipartBody.Part.createFormData(
"file",
imageFile.getName(),
fileBody
);
// 创建其他参数
RequestBody model = RequestBody.create(
MediaType.parse("text/plain"),
"avatar"
);
RequestBody pid = RequestBody.create(
MediaType.parse("text/plain"),
String.valueOf(userId)
);
// 调用接口
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<FileUploadResponse>> call =
apiService.uploadImage(filePart, model, pid);
call.enqueue(new Callback<ApiResponse<FileUploadResponse>>() {
@Override
public void onResponse(Call<ApiResponse<FileUploadResponse>> call,
Response<ApiResponse<FileUploadResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<FileUploadResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
String imageUrl = apiResponse.getData().getUrl();
// 使用图片URL
}
}
}
@Override
public void onFailure(Call<ApiResponse<FileUploadResponse>> call, Throwable t) {
// 处理错误
}
});
```
#### 上传视频
```java
// 创建文件部分
File videoFile = new File(videoPath);
RequestBody fileBody = RequestBody.create(
MediaType.parse("video/*"),
videoFile
);
MultipartBody.Part filePart = MultipartBody.Part.createFormData(
"file",
videoFile.getName(),
fileBody
);
// 创建其他参数
RequestBody model = RequestBody.create(
MediaType.parse("text/plain"),
"work"
);
RequestBody pid = RequestBody.create(
MediaType.parse("text/plain"),
String.valueOf(userId)
);
// 调用接口
ApiService apiService = ApiClient.getService(context);
Call<ApiResponse<FileUploadResponse>> call =
apiService.uploadVideo(filePart, model, pid);
call.enqueue(new Callback<ApiResponse<FileUploadResponse>>() {
@Override
public void onResponse(Call<ApiResponse<FileUploadResponse>> call,
Response<ApiResponse<FileUploadResponse>> response) {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<FileUploadResponse> apiResponse = response.body();
if (apiResponse.getCode() == 200) {
String videoUrl = apiResponse.getData().getUrl();
int duration = apiResponse.getData().getDuration();
// 使用视频URL和时长
}
}
}
@Override
public void onFailure(Call<ApiResponse<FileUploadResponse>> call, Throwable t) {
// 处理错误
}
});
```
---
## 错误处理
| 错误码 | 说明 |
|--------|------|
| 400 | 参数错误或文件格式不支持 |
| 401 | 未登录 |
| 413 | 文件过大 |
| 415 | 不支持的文件类型 |
| 500 | 服务器错误 |
---
## 注意事项
1. 所有上传接口都需要登录认证
2. 上传前建议先压缩图片以提高上传速度
3. 视频上传时间较长,建议显示进度条
4. 上传失败时可以重试
5. model和pid参数用于后端文件管理和关联
6. 返回的URL是完整的访问地址可直接使用
7. 建议在上传前检查文件大小和格式