AJAX/PHP d'upload avec barre de progression pour les gros fichiers

J'ai essayé de créer un non-flash télécharger panneau qui montre également une barre de progression.
Sur notre serveur, nous avons PHP 5.3 (impossible de mettre à niveau à 5,4 pour l'instant, la nouvelle progression du chargement de la fonctionnalité ne peut pas être utilisé => http://php.net/manual/en/session.upload-progress.php).
Nous ne pouvons pas utiliser des solutions à base de mémoire flash, extensions ou similaire.

Donc j'ai essayé d'utiliser un XMLHttpRequest combiné avec l'AJAX.
Le problème ici c'est que j'ai seulement réalisé des succès partiels.

J'ai réussi à télécharger et enregistrer sur le serveur un fichier d'environ 380 MO, toutefois, lorsque vous essayez avec un fichier de plus grande taille comme 4 GO, il ne sera pas enregistré sur le serveur (si je vérifie avec Firebug, à un moment donné, il va dire "POST abandonnée").

Une autre chose étrange est que, avec le même fichier de la xhr.le téléchargement.chargé commence avec la même dimension de xhr.le téléchargement.total et commence à compter à partir de là.

Personne ne sait comment résoudre ce problème ou a une solution alternative?

Le code du client est:

<script type="application/javascript" src="jquery.js"></script>

<script type="application/javascript">

function uploadToServer()
{
    fileField = document.getElementById("uploadedFile");
    var fileToUpload = fileField.files[0]; 

    var xhr = new XMLHttpRequest();
    var uploadStatus = xhr.upload;

    uploadStatus.addEventListener("progress", function (ev) {
            if (ev.lengthComputable) {
                $("#uploadPercentage").html((ev.loaded / ev.total) * 100 + "%");
            }
        }, false);

    uploadStatus.addEventListener("error", function (ev) {$("#error").html(ev)}, false);
    uploadStatus.addEventListener("load", function (ev) {$("#error").html("APPOSTO!")}, false);

    xhr.open(
            "POST",
            "serverUpload.php",
            true
            );
        xhr.setRequestHeader("Cache-Control", "no-cache");
        xhr.setRequestHeader("Content-Type", "multipart/form-data");
        xhr.setRequestHeader("X-File-Name", fileToUpload.fileName);
        xhr.setRequestHeader("X-File-Size", fileToUpload.fileSize);
        xhr.setRequestHeader("X-File-Type", fileToUpload.type);
        //xhr.setRequestHeader("Content-Type", "application/octet-stream");
        xhr.send(fileToUpload);
}



$(function(){

    $("#uploadButton").click(uploadToServer);

});


</script>

Partie HTML:

<form action="" name="uploadForm" method="post" enctype="multipart/form-data">

  <input id="uploadedFile" name="fileField" type="file" multiple />

<input id="uploadButton" type="button" value="Upload!">

</form>

<div id="uploadPercentage"></div>
<div id="error"></div>

Côté serveur code:

<?php

$path = "./";
$filename = $_SERVER['HTTP_X_FILE_NAME'];
$filesize = $_SERVER['CONTENT_LENGTH'];


$file = "log.txt";
$fo= fopen($file, "w");
fwrite($fo, $path . PHP_EOL);
fwrite($fo, $filename . PHP_EOL);
fwrite($fo, $filesize . PHP_EOL);
fwrite($fo, $path . $filename . PHP_EOL);

file_put_contents($path . $filename, 
file_get_contents('php://input')
);

?>
Regarder le php.ini les options de recherche de max_upload_file_size max_post_size et liées drapeaux de post/la taille du fichier téléchargé.
J'ai déjà vérifié ces et tout semble bien fonctionner.
Cela ressemble à une blague, mais parfois, les gens font des choses stupides, donc je vous la pose quand même : "Êtes-vous en utilisant comme système de fichiers FAT32?"
Avez-vous résoudre le problème déjà? Si oui, pourriez-vous s'il vous plaît partagez votre solution? Si ce n'est pas que sur le fractionnement du fichier en petits morceaux avec du jQuery blob fonction par exemple?

OriginalL'auteur DiG | 2012-04-20