这次也是在使用upload时遇到的问题。 需求是上传后可以直接下载文件。
而项目中是使用oss做上传和存储的,为了保护资源,并做了refer校验。也就是说,上传后的资源只能在当前域名下下载有效,一旦打开新页面就会被拒绝访问和下载。
原有的方式
<a-upload :file-list="defaultFileList" :before-upload="beforeUpLoad" :showUploadList="{ showRemoveIcon: false }" :customRequest="newFileAdd"> </a-upload>
这里发现了问题,在上传文件后,每次直接点击列表的文件都会跳转新页面,对文件路径进行访问。 这样直接就被oss验证给拒绝了。
一开始,一直在纠结需不需要重新创建一个可以公共访问的上传路径,这样可以直接访问上传的文件。 但是这样并不符合项目需求。所以重新找其他的方法。既然默认跳转新页面访问受限,那就在当前页面进行下载就可以。
这时候发现,ant design vue 其实提供了一个下载事件,也就是说自定义一个下载方法就可以了。
这里需要注意的是ant design vue的版本,最好用最新版本。
首先绑定事件配合下载按钮一起使用
<a-upload :file-list="defaultFileList" :before-upload="beforeUpLoad" :showUploadList="{ showRemoveIcon: false,
showDownloadIcon: true
}" :customRequest="newFileAdd" @download="downloadFile"> </a-upload>
但是这个时候出现一个问题,就是上传列表并不现实下载按钮。 原因是在对fileList中的对象赋值的时候,没有把status设置为done,如果是在uploading的状态下是不会现实下载按钮的。
修改后的代码
this.defaultFileList.push( { uid: '1', status: 'done', name: "xxx", url: fileUrl } )
这样就可以了。 不还有一个小问题,就是在上传后的列表中,点击下载按钮可以下载,点击文件名称也可以下载。 看了一下上传文件后的dom结构,默认将列表的文件放在一个a标签中显示出来,而a标签的url就是刚才代码中复制的那个url,所有这个做了一个小改动,就是将filelList中对象的url属性注释掉,不适用默认的url,使用其他的自定义属性保存文件上传后的url。然后在在下载文件的时候使用自己的url属性就可以了。
this.defaultFileList.push( { uid: '1', status: 'done', name: "xxx", //url: fileUrl downloadUrl:fileUrl //下载的时候直接用这个属性 } )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix