1
1
import { React , useState } from 'react' ;
2
2
import './Uploader.css' ;
3
3
import { FileUpload } from 'primereact/fileupload' ;
4
+ import { ProgressBar } from 'primereact/progressbar' ;
4
5
5
6
const Uploader = ( props ) => {
6
7
const [ serverHost ] = useState ( window . location . host . includes ( "localhost" ) ? "http://localhost:8080" : "" )
@@ -13,47 +14,60 @@ const Uploader = (props) => {
13
14
console . log ( "progress" , filename , event )
14
15
}
15
16
16
- const uploadHandler = function ( { files } ) {
17
+ const uploadChunk = function ( chunk , filename , chunkId ) {
18
+ console . log ( "uploading chunk" , filename )
19
+
17
20
18
- const uploadChunk = function ( chunk , filename , chunkId ) {
19
- console . log ( "uploading chunk" , filename )
20
- let progressBar = {
21
- chunkId : chunkId ,
22
- filename : filename ,
23
- loaded : 0 ,
24
- total : 0
25
- }
26
- setUploadProgress ( [ ...uploadProgress , progressBar ] )
21
+ let formData = new FormData ( ) ;
22
+ formData . append ( "demoFile" , chunk , filename ) ;
27
23
28
- let formData = new FormData ( ) ;
29
- formData . append ( "demoFile" , chunk , filename ) ;
30
-
31
- let xhr = new XMLHttpRequest ( ) ;
32
- xhr . upload . addEventListener ( 'progress' , ( e ) => {
33
- // TODO: set new state with progresses
34
- console . log ( "progress" , filename )
35
- progressBar . loaded = e . loaded
36
- progressBar . total = e . total
37
- } ) ;
38
- xhr . onreadystatechange = ( xhr , event ) => {
39
- console . log ( "onreadystatechange" , xhr , event )
40
- } ;
41
- xhr . open ( 'POST' , serverHost + "/match/upload" , true ) ;
42
- xhr . withCredentials = props . withCredentials ;
43
- xhr . send ( formData ) ;
44
- }
24
+ let xhr = new XMLHttpRequest ( ) ;
25
+ xhr . upload . addEventListener ( 'progress' , ( e ) => {
26
+ // TODO: set new state with progresses
27
+ console . log ( "progress" , uploadProgress )
28
+ setUploadProgress ( ( old ) => old . map ( p => {
29
+ if ( p . chunkId === chunkId ) {
30
+ return {
31
+ chunkId : chunkId ,
32
+ filename : filename ,
33
+ loaded : e . loaded ,
34
+ total : e . total
35
+ }
36
+ } else {
37
+ return p
38
+ }
39
+ } ) )
40
+ } ) ;
41
+ xhr . onreadystatechange = ( xhr , event ) => {
42
+ console . log ( "onreadystatechange" , xhr , event )
43
+ } ;
44
+ xhr . open ( 'POST' , serverHost + "/match/upload" , true ) ;
45
+ xhr . send ( formData ) ;
46
+ }
45
47
48
+ const uploadHandler = function ( { files } ) {
46
49
const [ file ] = files ;
47
50
const chunkSize = 1024 * 1024 * 30 ; // 30MB
48
51
49
52
let start = 0 ;
50
53
let chunkNo = 0 ;
51
54
while ( start < file . size ) {
55
+ const newUp = {
56
+ chunkId : chunkNo ,
57
+ filename : file . name + "_" + chunkNo ,
58
+ loaded : 0 ,
59
+ total : 0
60
+ }
61
+ setUploadProgress ( old => [ ...old , newUp ] )
52
62
uploadChunk ( file . slice ( start , start + chunkSize ) , file . name + "_" + chunkNo , chunkNo ++ ) ;
53
63
start += chunkSize ;
54
64
}
55
65
}
56
66
67
+ const valueTemplate = function ( p , percent ) {
68
+ return p . filename
69
+ }
70
+
57
71
return (
58
72
< div >
59
73
< FileUpload
@@ -69,7 +83,7 @@ const Uploader = (props) => {
69
83
auto />
70
84
< div >
71
85
{ uploadProgress . map ( ( p ) => (
72
- < div key = { p . chunkId } > { p . filename } - { p . loaded } / { p . total } </ div >
86
+ < ProgressBar key = { p . chunkId } value = { ( p . loaded / p . total ) * 100 } displayValueTemplate = { ( percent ) => valueTemplate ( p , percent ) } / >
73
87
) ) }
74
88
</ div >
75
89
</ div >
0 commit comments