refactor: 优化文件下载功能和移除预览点击
This commit is contained in:
@ -58,7 +58,8 @@
|
|||||||
<div v-for="item in detail?.files" :key="item.id" class="flex items-center justify-between border-b-[1px] border-b-[#eee] border-b-solid py-[10px]">
|
<div v-for="item in detail?.files" :key="item.id" class="flex items-center justify-between border-b-[1px] border-b-[#eee] border-b-solid py-[10px]">
|
||||||
<!-- <img src="~/assets/images/avater.png" alt="" srcset="" class="h-30px w-30px" /> -->
|
<!-- <img src="~/assets/images/avater.png" alt="" srcset="" class="h-30px w-30px" /> -->
|
||||||
<div>
|
<div>
|
||||||
<span class="ml-[10px] cursor-pointer" @click="handleDownloadPreview(item)">{{ item.title }}</span>
|
<!-- <span class="ml-[10px] cursor-pointer" @click="handleDownloadPreview(item)">{{ item.title }}</span> -->
|
||||||
|
<span class="ml-[10px]">{{ item.title }}</span>
|
||||||
<span v-if="item.size" class="ml-[200px] color-[#999]">{{ item.size || '-' }}</span>
|
<span v-if="item.size" class="ml-[200px] color-[#999]">{{ item.size || '-' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<el-button
|
<el-button
|
||||||
|
|||||||
@ -88,15 +88,49 @@ export const formatNumber = (value?: number, decimals = 0) => {
|
|||||||
* @param url 文件地址
|
* @param url 文件地址
|
||||||
* @param filename 文件名
|
* @param filename 文件名
|
||||||
*/
|
*/
|
||||||
export const downloadFile = (url: string, filename: string) => {
|
export const downloadFile = async (url: string, filename: string) => {
|
||||||
const a = document.createElement('a')
|
if (!process.client) return;
|
||||||
a.href = url
|
|
||||||
a.download = filename || 'download' // 设置下载的文件名
|
try {
|
||||||
document.body.appendChild(a)
|
const response = await fetch(url);
|
||||||
a.click()
|
const reader = response.body.getReader();
|
||||||
document.body.removeChild(a)
|
const contentLength = +response.headers.get('Content-Length');
|
||||||
}
|
let receivedLength = 0;
|
||||||
|
|
||||||
|
const stream = new ReadableStream({
|
||||||
|
async start(controller) {
|
||||||
|
while (true) {
|
||||||
|
const { done, value } = await reader.read();
|
||||||
|
if (done) {
|
||||||
|
controller.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
receivedLength += value.length;
|
||||||
|
const progress = (receivedLength / contentLength * 100).toFixed(2);
|
||||||
|
console.log(`下载进度: ${progress}%`);
|
||||||
|
controller.enqueue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const blob = await new Response(stream).blob();
|
||||||
|
const objectURL = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = objectURL;
|
||||||
|
a.download = filename || 'download';
|
||||||
|
a.style.display = 'none';
|
||||||
|
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
|
||||||
|
URL.revokeObjectURL(objectURL);
|
||||||
|
document.body.removeChild(a);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('下载失败:', error);
|
||||||
|
// 可添加错误提示逻辑
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断传入的参数是否为数组
|
* 判断传入的参数是否为数组
|
||||||
|
|||||||
Reference in New Issue
Block a user