Skip to content

Commit 5fc6ff1

Browse files
committed
new demo: dnd + filereader + xhr2
1 parent 73693f5 commit 5fc6ff1

File tree

4 files changed

+126
-1
lines changed

4 files changed

+126
-1
lines changed

demos.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
[
2+
{
3+
"desc": "Drag and drop and XHR upload",
4+
"url": "dnd-upload",
5+
"tags": "file dnd xhr2",
6+
"support": {
7+
"live": "chrome firefox",
8+
"nightly": "ie"
9+
},
10+
"test": "typeof FileReader != 'undefined' && 'draggable' in document.createElement('span') && !!window.FormData && 'upload' in new XMLHttpRequest"
11+
},
212
{
313
"desc": "Simple class manipulation",
414
"url": "classlist",

demos/dnd-upload.html

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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 &amp; drop not supported, but you can still upload via this input field:<br><input type="file"></label></p>
14+
<p id="filereader">File API &amp; 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>

demos/file-api.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
var file = e.dataTransfer.files[0],
2929
reader = new FileReader();
3030
reader.onload = function (event) {
31+
console.log(event.target);
3132
holder.style.background = 'url(http://github.com/'%3C/span%3E%20%3Cspan%20class=pl-c1%3E+%3C/span%3E%20%3Cspan%20class=pl-s1%3Eevent%3C/span%3E%3Cspan%20class=pl-kos%3E.%3C/span%3E%3Cspan%20class=pl-c1%3Etarget%3C/span%3E%3Cspan%20class=pl-kos%3E.%3C/span%3E%3Cspan%20class=pl-c1%3Eresult%3C/span%3E%20%3Cspan%20class=pl-c1%3E+%3C/span%3E%20%3Cspan%20class=pl-s%3E') no-repeat center';
3233
};
34+
console.log(file);
3335
reader.readAsDataURL(file);
3436

3537
return false;
3638
};
37-
</script>
39+
</script>

devnull.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
var_dump($_FILES)
3+
?>

0 commit comments

Comments
 (0)