olp项目中的文件上传和下载功能
OLP项目文件上传下载功能实现
#tech / dev / project
#type / howto
#status / seed
[!info] related notes
olp项目中的文件上传和下载功能
上传课堂资源
组件
uploadMaterial 组件
抽屉页面,包含 CourseResource 组件 和 保存(触发create api, 取消 按钮。
CourseResource 组件
用于上传课堂资源,包含 LargeFileUpload 组件
LargeFileUpload 组件
- 用于上传大文件
- 传入设置参数(文件数量、多选、文件类型、正在上传的文件列表
- 传出成功事件、删除事件、初始化事件
上传流程
- 点击后选择上传
- 文件直接开始分片上传到服务器,上传成功后后端进行 merge 返回资源的 id、path、url
- 调用 addResource api 来将上传的资源进行保存???
- 再调用 createMaterial api 来将保存的资源添加到 courseResource 调用 createMaterial 需要一个资源文件的 id(需要 addResource api 返回)
资源上传又失败了
资源信息如下:
[
{
“origin”: 0,
“format”: “application/pdf”,
“mediaType”: 3,
“lang”: [
“1”
],
“duration”: 300,
“fileId”: 3585,
“size”: 22907,
“url”: “https://resource.credat.com.cn/sas/20250825/265b2c2d-7b15-4291-b2a8-8ad3116e9142.pdf”,
“name”: “新建 DOCX 文档.pdf”,
“title”: “新建 DOCX 文档.pdf”
}
]
resource 接口返回的数据为 null
使用了 pnpm test 测试环境 + .env.test中的 请求路径 为 空,能够正常上传数据了
删除
下载
// 更可靠的下载方法
const response = await fetch(url)
const blob = await response.blob()
const link = document.createElement('a')
link.href = URL.createObjectURL(blob) // 使用 blob URL
link.download = fileName
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(link.href) // 清理内存
总结
先上传到服务器,再合并,再添加到服务器资源(此时前端应该传入 address 作为文件地址,方便后续下载),再链接到课程,