File tree Expand file tree Collapse file tree 3 files changed +50
-5
lines changed
Expand file tree Collapse file tree 3 files changed +50
-5
lines changed Original file line number Diff line number Diff line change 88 < body >
99 < h1 > GitHub Artifact プレビュー</ h1 >
1010 < div >
11+ < progress id ="progress " value ="0 "> </ progress >
1112 < p id ="result " />
1213 </ div >
1314 < script type ="module " src ="/src/main.ts "> </ script >
Original file line number Diff line number Diff line change @@ -27,19 +27,46 @@ export const fetchDownloadUrl = async (
2727
2828export const downloadFile = async (
2929 url : string ,
30- ) : Promise < Result < ArrayBuffer > > => {
30+ onProgress : ( progress : number ) => void = ( ) => { } ,
31+ ) : Promise < Result < Response > > => {
3132 try {
3233 const resp = await fetch ( url ) ;
3334
3435 if ( ! resp . ok ) {
3536 return {
3637 ok : false ,
37- message : " zipファイルの取得に失敗しました" ,
38+ message : ` zipファイルの取得に失敗しました: ${ resp . statusText } ` ,
3839 error : new Error ( `HTTP error!: ${ resp . statusText } ` ) ,
3940 } ;
4041 }
4142
42- return { ok : true , value : await resp . arrayBuffer ( ) } ;
43+ const size = Number ( resp . headers . get ( "Content-Length" ) ?? "-1" ) ;
44+
45+ return {
46+ ok : true ,
47+ value : new Response (
48+ new ReadableStream ( {
49+ async start ( controller ) {
50+ const reader = resp . body ?. getReader ( ) ;
51+ let chunk = 0 ;
52+
53+ async function read ( ) {
54+ const result = await reader ?. read ( ) ;
55+
56+ if ( result && ! result . done ) {
57+ chunk += result . value . length ;
58+ onProgress ( chunk / size ) ;
59+
60+ controller . enqueue ( result . value ) ;
61+ return await read ( ) ;
62+ }
63+ }
64+ await read ( ) ;
65+ controller . close ( ) ;
66+ } ,
67+ } ) ,
68+ ) ,
69+ } ;
4370 } catch ( error ) {
4471 return {
4572 ok : false ,
Original file line number Diff line number Diff line change 1+ import "./style.css" ;
12import { downloadFile , fetchDownloadUrl } from "./lib/fetch" ;
23
34const main = async ( ) => {
@@ -10,13 +11,29 @@ const main = async () => {
1011 return result . message ;
1112 }
1213
14+ const progressBar = document . getElementById ( "progress" ) ;
15+ const status = document . getElementById ( "result" ) ;
16+
1317 const downloadUrl = result . value ;
14- const result1 = await downloadFile ( downloadUrl ) ;
18+ const result1 = await downloadFile ( downloadUrl , ( progress ) => {
19+ if ( progress < 0 ) {
20+ return ;
21+ }
22+
23+ if ( progressBar ) {
24+ progressBar . setAttribute ( "value" , String ( progress ) ) ;
25+ progressBar . innerText = `${ Math . floor ( progress * 100 ) } %` ;
26+ }
27+ if ( status ) {
28+ status . innerText = `ファイルをダウンロードしています……: ${ Math . floor ( progress * 100 ) } %` ;
29+ }
30+ } ) ;
31+
1532 if ( ! result1 . ok ) {
1633 return result1 . message ;
1734 }
1835
19- const buf = result1 . value ;
36+ const buf = await result1 . value . arrayBuffer ( ) ;
2037 const view = new DataView ( buf ) ;
2138
2239 // end of central directory record(EOCD)を探す
You can’t perform that action at this time.
0 commit comments