1
+ < title > Drag and drop, automatic upload</ title >
2
+ < style >
3
+ # holder { border : 10px dashed # ccc ; width : 300px ; min-height : 300px ; margin : 20px auto;}
4
+ # holder .hover { border : 10px dashed # 0c0 ; }
5
+ # holder img { display : block; margin : 10px auto; }
6
+ # holder p { margin : 10px ; font-size : 14px ; }
7
+ meter { width : 100% ; }
8
+ meter : after { content : '%' ; }
9
+ </ style >
10
+ < article >
11
+ < div id ="holder ">
12
+ </ div >
13
+ < p id ="upload " hidden > < label > Drag & drop not supported, but you can still upload via this input field:< br > < input type ="file "> </ label > </ p >
14
+ < p id ="filereader "> File API & FileReader API not supported</ p >
15
+ < p id ="formdata "> XHR2's FormData is not supported</ p >
16
+ < p id ="progress "> XHR2's upload progress isn't supported</ p >
17
+ < p > Upload progress: < meter id ="uploadprogress " min ="0 " max ="100 " value ="0 "> 0</ meter > </ p >
18
+ < p > Drag an image from your desktop on to the drop zone above to see the browser both render the preview, but also upload automatically to this server.</ p >
19
+ </ article >
20
+ < script >
21
+ var holder = document . getElementById ( 'holder' ) ,
22
+ tests = {
23
+ filereader : typeof FileReader != 'undefined' ,
24
+ dnd : 'draggable' in document . createElement ( 'span' ) ,
25
+ formdata : ! ! window . FormData ,
26
+ progress : "upload" in new XMLHttpRequest
27
+ } ,
28
+ support = {
29
+ filereader : document . getElementById ( 'filereader' ) ,
30
+ formdata : document . getElementById ( 'formdata' ) ,
31
+ progress : document . getElementById ( 'progress' )
32
+ } ,
33
+ acceptedTypes = {
34
+ 'image/png' : true ,
35
+ 'image/jpeg' : true ,
36
+ 'image/gif' : true
37
+ } ,
38
+ progress = document . getElementById ( 'uploadprogress' ) ,
39
+ fileupload = document . getElementById ( 'upload' ) ;
40
+
41
+ "filereader formdata progress" . split ( ' ' ) . forEach ( function ( api ) {
42
+ if ( tests [ api ] === false ) {
43
+ support [ api ] . className = 'fail' ;
44
+ } else {
45
+ support [ api ] . hidden = true ;
46
+ }
47
+ } ) ;
48
+
49
+ function previewfile ( file ) {
50
+ if ( tests . filereader === true && acceptedTypes [ file . type ] === true ) {
51
+ var reader = new FileReader ( ) ;
52
+ reader . onload = function ( event ) {
53
+ var image = new Image ( ) ;
54
+ image . src = event . target . result ;
55
+ image . width = 250 ; // a fake resize
56
+ holder . appendChild ( image ) ;
57
+ } ;
58
+
59
+ reader . readAsDataURL ( file ) ;
60
+ } else {
61
+ holder . innerHTML += '<p>Uploaded ' + file . name + ' ' + ( file . fileSize ? ( file . fileSize / 1024 | 0 ) + 'K' : '' ) ;
62
+ console . log ( file ) ;
63
+ }
64
+ }
65
+
66
+ function readfiles ( files ) {
67
+ debugger ;
68
+ var formData = tests . formdata ? new FormData ( ) : null ;
69
+ for ( var i = 0 ; i < files . length ; i ++ ) {
70
+ if ( tests . formdata ) formData . append ( 'file' , files [ i ] ) ;
71
+ previewfile ( files [ i ] ) ;
72
+ }
73
+
74
+ // now post a new XHR request
75
+ if ( tests . formdata ) {
76
+ var xhr = new XMLHttpRequest ( ) ;
77
+ xhr . open ( 'POST' , '/devnull.php' ) ;
78
+ xhr . onload = function ( ) {
79
+ progress . value = progress . innerHTML = 100 ;
80
+ } ;
81
+
82
+ if ( tests . progress ) {
83
+ xhr . upload . onprogress = function ( event ) {
84
+ if ( event . lengthComputable ) {
85
+ var complete = ( event . loaded / event . total * 100 | 0 ) ;
86
+ progress . value = progress . innerHTML = complete ;
87
+ }
88
+ }
89
+ }
90
+
91
+ xhr . send ( formData ) ;
92
+ }
93
+ }
94
+
95
+ if ( tests . dnd ) {
96
+ holder . ondragover = function ( ) { this . className = 'hover' ; return false ; } ;
97
+ holder . ondragend = function ( ) { this . className = '' ; return false ; } ;
98
+ holder . ondrop = function ( e ) {
99
+ this . className = '' ;
100
+ e . preventDefault ( ) ;
101
+ readfiles ( e . dataTransfer . files ) ;
102
+ }
103
+ } else {
104
+ fileupload . hidden = false ;
105
+ fileupload . querySelector ( 'input' ) . onchange = function ( ) {
106
+ readfiles ( this . files ) ;
107
+ } ;
108
+ }
109
+
110
+ </ script >
0 commit comments