|
@@ -6,10 +6,7 @@
|
|
|
</div>
|
|
|
|
|
|
<div v-if="state === State.package">
|
|
|
- <div
|
|
|
- class="text"
|
|
|
- style="display: flex; justify-content: space-between; margin-top: 15px"
|
|
|
- >
|
|
|
+ <div class="text" style="display: flex; justify-content: space-between; margin-top: 15px">
|
|
|
<span>{{ filename }}</span>
|
|
|
<span>{{ percent }}%</span>
|
|
|
</div>
|
|
@@ -93,6 +90,19 @@ const initial = async () => {
|
|
|
downloadURL.value = res.data.downloadUrl;
|
|
|
}
|
|
|
};
|
|
|
+function isValidUrl(url) {
|
|
|
+ // 正则表达式模式
|
|
|
+ const pattern = new RegExp(
|
|
|
+ '^(https?:\\/\\/)?' + // 协议 (http:// 或 https://)
|
|
|
+ '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // 域名
|
|
|
+ '((\\d{1,3}\\.){3}\\d{1,3}))' + // 或 IP 地址
|
|
|
+ '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // 端口和路径
|
|
|
+ '(\\?[;&a-z\\d%_.~+=-]*)?' + // 查询字符串
|
|
|
+ '(\\#[-a-z\\d_]*)?$', 'i' // 片段
|
|
|
+ );
|
|
|
+
|
|
|
+ return pattern.test(url);
|
|
|
+}
|
|
|
|
|
|
// 下载
|
|
|
const download = () => {
|
|
@@ -100,9 +110,14 @@ const download = () => {
|
|
|
ElMessage.error("下载链接未生成,请稍等!");
|
|
|
throw "下载链接未生成,请稍等!";
|
|
|
} else {
|
|
|
- if (!downloadURL.value.startsWith("/")) {
|
|
|
- downloadURL.value = "/" + downloadURL.value;
|
|
|
+ if (isValidUrl(downloadURL.value)) {
|
|
|
+ downloadURL.value = downloadURL.value;
|
|
|
+ } else {
|
|
|
+ if (!downloadURL.value.startsWith("/")) {
|
|
|
+ downloadURL.value = "/" + downloadURL.value;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
console.error("downloadURL.value", downloadURL.value);
|
|
|
return saveAs(downloadURL.value, filename.value);
|
|
|
}
|