2012-04-02 8 views
0

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!

Antwort

1

Sehen Sie sich die Servervariablen:

  • MAX_FILE_SIZE
  • upload_max_filesize
  • post_max_size
  • memory_limit

http://php.net/manual/en/features.file-upload.post-method.php

Sie einige Limi haben tation in diesen Variablen.

Grüße!

+0

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 –

+0

Ü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

+0

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 –