Skip to content

Commit 3264120

Browse files
author
Pablo Brasero Moreno
committed
Example showing both ways to use FormData
1 parent 4fa163f commit 3264120

File tree

2 files changed

+60
-33
lines changed

2 files changed

+60
-33
lines changed

example_html5_upload.rb

+15-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,17 @@
55
send_file File.join(settings.public_folder, 'index.html')
66
end
77

8+
post '/' do
9+
our_file = params.delete('our-file')
10+
"Received form fields:\n\n" + pretty_str(params) +
11+
"\nAnd uploaded file:\n\n" + file_info(our_file)
12+
end
13+
814
post '/upload' do
9-
file = params['our-file']
15+
file_info params['our-file']
16+
end
17+
18+
def file_info(file)
1019
details = {
1120
:filename => file[:filename],
1221
:type => file[:type],
@@ -15,5 +24,9 @@
1524
:tempfile_path => file[:tempfile].path,
1625
:tempfile_size => file[:tempfile].size,
1726
}
18-
''.tap{|output| PP.pp(details, output) }
27+
pretty_str details
1928
end
29+
30+
def pretty_str(obj)
31+
''.tap{|output| PP.pp(obj, output) }
32+
end

public/index.html

+45-31
Original file line numberDiff line numberDiff line change
@@ -10,54 +10,68 @@
1010
<p><label>Some other field: <input name="other-field" type="text" id="other-field-id" /></label></p>
1111
<p><input type="submit" value="Save" /></p>
1212
<script>
13+
var form = document.getElementById('form-id');
14+
form.onsubmit = function() {
15+
var formData = new FormData(form);
16+
var action = form.getAttribute('action');
17+
18+
sendXHRequest(formData, action);
19+
20+
return false;
21+
}
22+
1323
var uploadBtn = document.getElementById('upload-button-id');
1424
uploadBtn.onclick = function (evt) {
15-
var fileInput = document.getElementById('file-id');
16-
var file = fileInput.files[0];
1725
var formData = new FormData();
1826
var action = '/upload';
27+
var fileInput = document.getElementById('file-id');
28+
var file = fileInput.files[0];
1929
formData.append('our-file', file);
2030

31+
sendXHRequest(formData, action);
32+
33+
return false;
34+
}
35+
36+
function sendXHRequest(formData, uri) {
2137
var xhr = new XMLHttpRequest();
2238
xhr.upload.addEventListener('loadstart', onloadstartHandler, false);
2339
xhr.upload.addEventListener('progress', onprogressHandler, false);
2440
xhr.upload.addEventListener('load', onloadHandler, false);
2541
xhr.addEventListener('readystatechange', onreadystatechangeHandler, false);
26-
xhr.open('POST', action, true);
27-
xhr.send(formData); // Simple!
28-
29-
return false;
42+
xhr.open('POST', uri, true);
43+
xhr.send(formData);
44+
}
3045

31-
function onloadstartHandler(evt) {
32-
var div = document.getElementById('upload-status');
33-
div.innerHTML = 'Upload started!';
34-
}
46+
function onloadstartHandler(evt) {
47+
var div = document.getElementById('upload-status');
48+
div.innerHTML = 'Upload started!';
49+
}
3550

36-
function onloadHandler(evt) {
37-
var div = document.getElementById('upload-status');
38-
div.innerHTML = 'Upload successful!';
39-
}
51+
function onloadHandler(evt) {
52+
var div = document.getElementById('upload-status');
53+
div.innerHTML = 'Upload successful!';
54+
}
4055

41-
function onprogressHandler(evt) {
42-
var div = document.getElementById('progress');
43-
var percent = evt.loaded/evt.total*100;
44-
div.innerHTML = 'Progress: ' + percent + '%';
45-
}
56+
function onprogressHandler(evt) {
57+
var div = document.getElementById('progress');
58+
var percent = evt.loaded/evt.total*100;
59+
div.innerHTML = 'Progress: ' + percent + '%';
60+
}
4661

47-
function onreadystatechangeHandler(evt) {
48-
var status = null;
62+
function onreadystatechangeHandler(evt) {
63+
var status = null;
4964

50-
try {
51-
status = evt.target.status;
52-
}
53-
catch(e) {
54-
return;
55-
}
65+
try {
66+
status = evt.target.status;
67+
}
68+
catch(e) {
69+
return;
70+
}
5671

57-
if (status == '200' && evt.target.responseText) {
58-
var result = document.getElementById('result');
59-
result.innerHTML = '<p>The server saw it as:</p><pre>' + evt.target.responseText + '</pre>';
60-
}
72+
if (status == '200' && evt.target.responseText) {
73+
var result = document.getElementById('result');
74+
result.innerHTML = '<p>The server saw it as:</p><pre>' + evt.target.responseText + '</pre>';
6175
}
6276
}
6377
</script>

0 commit comments

Comments
 (0)