gradio

Форк
0
/
DownloadLink.svelte 
90 строк · 2.1 Кб
1
<script lang="ts">
2
	import type { HTMLAnchorAttributes } from "svelte/elements";
3
	import { createEventDispatcher } from "svelte";
4

5
	interface DownloadLinkAttributes
6
		extends Omit<HTMLAnchorAttributes, "target"> {
7
		download: NonNullable<HTMLAnchorAttributes["download"]>;
8
	}
9
	type $$Props = DownloadLinkAttributes;
10

11
	import { getWorkerProxyContext } from "./context";
12
	import { should_proxy_wasm_src } from "./file-url";
13
	import { getHeaderValue } from "../src/http";
14

15
	export let href: DownloadLinkAttributes["href"] = undefined;
16
	export let download: DownloadLinkAttributes["download"];
17

18
	const dispatch = createEventDispatcher();
19

20
	let is_downloading = false;
21
	const worker_proxy = getWorkerProxyContext();
22
	async function wasm_click_handler(): Promise<void> {
23
		if (is_downloading) {
24
			return;
25
		}
26

27
		dispatch("click");
28

29
		if (href == null) {
30
			throw new Error("href is not defined.");
31
		}
32
		if (worker_proxy == null) {
33
			throw new Error("Wasm worker proxy is not available.");
34
		}
35

36
		const url = new URL(href, window.location.href);
37
		const path = url.pathname;
38

39
		is_downloading = true;
40
		worker_proxy
41
			.httpRequest({
42
				method: "GET",
43
				path,
44
				headers: {},
45
				query_string: ""
46
			})
47
			.then((response) => {
48
				if (response.status !== 200) {
49
					throw new Error(`Failed to get file ${path} from the Wasm worker.`);
50
				}
51
				const blob = new Blob([response.body], {
52
					type: getHeaderValue(response.headers, "content-type")
53
				});
54
				const blobUrl = URL.createObjectURL(blob);
55

56
				const link = document.createElement("a");
57
				link.href = blobUrl;
58
				link.download = download;
59
				link.click();
60

61
				URL.revokeObjectURL(blobUrl);
62
			})
63
			.finally(() => {
64
				is_downloading = false;
65
			});
66
	}
67
</script>
68

69
{#if worker_proxy && should_proxy_wasm_src(href)}
70
	{#if is_downloading}
71
		<slot />
72
	{:else}
73
		<a {...$$restProps} {href} on:click|preventDefault={wasm_click_handler}>
74
			<slot />
75
		</a>
76
	{/if}
77
{:else}
78
	<a
79
		{href}
80
		target={typeof window !== "undefined" && window.__is_colab__
81
			? "_blank"
82
			: null}
83
		rel="noopener noreferrer"
84
		{download}
85
		{...$$restProps}
86
		on:click={dispatch.bind(null, "click")}
87
	>
88
		<slot />
89
	</a>
90
{/if}
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.