загрузить с ajax и php без iFrame или флеш-движка - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь сделать функцию загрузки AJAX с индикатором выполнения, я пытался упростить пример, который я нашел в Интернете, и я пришел к этой функции:

<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>

она работает хорошо, когда язагружать файлы размером около 800 КБ - 1 МБ, и это очень быстро, но выдает ошибку, когда я пытаюсь загрузить файлы большего размера.Индикатор выполнения показывает, что он загружается, но onreadystatechange не запускается и файл не появляется на сервере.

php, который отвечает на этот ajax, таков:

<?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";
}
?>

Заранее спасибоДаниэль!

1 Ответ

1 голос
/ 02 апреля 2012

Проверьте переменные сервера:

  • MAX_FILE_SIZE
  • upload_max_filesize
  • post_max_size
  • memory_limit

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

У вас могут быть некоторые ограничения в этих переменных.

Привет!

...