Dateien hochladen

Folgend ein Beispiel um mit der json.php Schnittstelle Dateien hochzuladen. Da JSON erwartet und zurückgegeben wird, wird die hochzuladende Datei im Client gelesen und base64 kodiert an den Server gesendet.

HTML

<form enctype="multipart/form-data" onsubmit="upload(this); return false;">
<input type="file" name="file">
<input type="submit" name="Upload">
</form>

Javascript

function upload(form) {
if (JSON && form.elements.file.files.length) {
var file = form.elements.file.files[0];

var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}
if (xmlhttp) {
xmlhttp.open('POST', '/json.php', true);
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var ret = JSON.parse(xmlhttp.responseText);
}
};

var reader = new FileReader();
reader.onload = function(e) {
xmlhttp.send(JSON.stringify({
site : 'demo',
lang : 'de',
id : 2,
params : {
name : file.name,
data : e.target.result
},
method : 'upload'
}));
};
reader.readAsDataURL(file);
}
}
}

PHP

class JSON_Request extends Ego_Request {
public function upload($name, $data) {
// Binär String aus base64 kodiertem String erhalten
$data = base64_decode(explode(',', $data, 2)[1]);

// Binär String in temporäre Datei speichern
$source = tempnam($GLOBALS['egotec_conf']['tmp_dir'], 'upload');
Ego_System::file_put_contents($source, $data);

// Temporäre Datei in den Mediapool speichern
return $this->page->poolPut($source, $name);
}
}