Ich versuche, eine Ajax-Upload-Funktion mit Fortschrittsbalken zu machen, ich habe versucht ein Beispiel i des Internets gefunden zu vereinfachen, und ich kam zu dieser Funktion:Upload mit AJAX und PHP ohne iFrame oder Flash-Motor
<form>
<input type="file" id="file" /><label for="file"></label><label id="aaa"></label>
<button id="sub">abc</button>
</form>
<script src="js/jquery-1.7.1.min.js"></script>
<script>
function uploadFile(files) {
var xmlhttp;
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.upload.onprogress = function(e) {
$("#aaa").empty().append(e.loaded + " - " + e.total);
}
xmlhttp.upload.onload = function(e) {
$("#aaa").empty().append("finish");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert(xmlhttp.responseText);
}
}
xmlhttp.open("post", "post.php", true);
xmlhttp.setRequestHeader("If-Modified-Since", "Mon, 26 Jul 1997 05:00:00 GMT");
xmlhttp.setRequestHeader("Cache-Control", "no-cache");
xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xmlhttp.setRequestHeader("X-File-Name", files[0].fileName);
xmlhttp.setRequestHeader("X-File-Size", files[0].fileSize);
xmlhttp.setRequestHeader("Content-Type", "multipart/form-data");
xmlhttp.send(files[0]);
}
$(document).ready(function() {
$("#file").change(function() {
uploadFile(this.files);
});
});
</script>
es funktioniert gut, wenn ich Dateien nahe oder unter 800kb hochladen - 1MB und es ist sehr schnell, aber es Bugs aus, wenn ich versuche, größere Dateien hochzuladen. Der Fortschrittsbalken zeigt, dass er hochgeladen wird, aber die Datei "onreadystatechange" nicht ausgelöst wird und die Datei nicht auf dem Server angezeigt wird. diese
Die PHP, die auf diese Ajax-Antwort ist:
<?php
// e.g. url:"page.php?upload=true" as handler property
//print_r($_SERVER);
if(
// basic checks
isset(
$_SERVER['CONTENT_TYPE'],
$_SERVER['CONTENT_LENGTH'],
$_SERVER['HTTP_X_FILE_NAME']
) &&
$_SERVER['CONTENT_TYPE'] == 'multipart/form-data'
){
// create the object and assign property
/*$file = new stdClass;
$file->name = basename($_SERVER['HTTP_X_FILE_NAME']);
$file->size = $_SERVER['HTTP_X_FILE_SIZE'];
$file->content = file_get_contents("php://input");
// if everything is ok, save the file somewhere
if(file_put_contents('files/'.$file->name, $file->content))
echo "OK";*/
$file->name = basename($_SERVER['HTTP_X_FILE_NAME']);
$input = fopen('php://input', 'rb');
$file = fopen('files/'.$file->name, 'wb');
stream_copy_to_stream($input, $file);
fclose($input);
fclose($file);
} else {
// if there is an error this will be the output instead of "OK"
echo "Error";
}
?>
Danke im Voraus, Daniel!
der lustige Teil ist, wenn ich versuche, ein JPG zum Beispiel hochladen .. das hat wie 500 kb, manchmal funktioniert es, manchmal tut es nicht, es blockiert nur und löst nicht die onreadystatechange –
Überprüfen Sie den Wert der Variablen $ _file ["your_upload_file"] ["error"], Enthält es einen anderen Fehlercode als Null ?. Führen Sie var_dump ($ _ FILE) aus, um die Dateiinformationen anzuzeigen, die hochgeladen werden sollen. – Lobo
Wenn ich var_dump ($ _ FILES) mache, ist es nur Array .. und wenn ich versuche $ _file ["your_upload_file"] ["error"] es funktioniert nicht, da ich nicht auf submit hochladen, versuche ich uploadChange auf Eingabe –