这次也是在使用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 //下载的时候直接用这个属性 } )