Загрузка изображения SWFUpload не выполняется на PHP с «загружен частичный файл»

Хорошо, это сложный вопрос, я часами искал решение / проблему. Я использую SWFUpload для загрузки изображений без перезагрузки страницы (также с причудливой полосой выполнения), это отлично работает, когда я нахожусь на localhost (сервер Wamp), но сходит с ума, когда я пытаюсь сделать это на моем реальном сервере Linux ( что является единственным возможным флагом, насколько я мог видеть), он запускает Apache2 и PHP5. Как я уже сказал, интерфейс в порядке (не считая того факта, что это вспышка). Внутренний код выглядит следующим образом:

SWFUpload_settings.js

var swfu_settings ={upload_url  : "upload.php",
                flash_url   : "flash/swfupload.swf",
                button_placeholder_id   : "upload_flash",
                file_size_limit : "2 MB",
                file_types  : "*.gif;*.jpg;*.png",
                file_post_name  :   "Filedata",
                file_queue_limit    :   1,
                post_params     :   {
                        "PHPSESSID" : getCookie()
                },
                upload_start_handler    : upload_start,
                upload_error_handler    : upload_error,
                upload_complete_handler : upload_complete,
                upload_progress_handler : upload_progress,
                file_queued_handler :   file_queued,
                button_disabled : false,
                button_width : 120, 
                button_height : 22,
                button_text : '<div class="adm_upload">Select image</div>',
                button_text_style : '.adm_upload{color:#ff0000;}'
                };

upload.php

function manageUpload(){
        if( isset($_FILES['Filedata']) ){
            $dest_dir = $_SERVER[DOCUMENT_ROOT]."/images/products";
            $destination =  $_SERVER[DOCUMENT_ROOT]."/images/products/" . $_FILES['Filedata']['name'];
            if( is_dir($dest_dir) ){
                if( is_writable($dest_dir) ){
                    if( !move_uploaded_file($_FILES['Filedata']['tmp_name'], $destination ) ){
                        $html_body = '<h1>File upload error!</h1>';
                        switch ($_FILES['Filedata']['error']) {
                            case 1:
                                $html_body .= 'The file is bigger than this PHP installation allows';
                                break;
                            case 2:
                                $html_body .= 'The file is bigger than this form allows';
                                break;
                            case 3:
                                $html_body .= 'Only part of the file was uploaded';
                                break;
                            case 4:
                                $html_body .= 'No file was uploaded';
                                break;
                            default:
                                $html_body .= 'unknown errror';
                        } 
                        echo ($html_body);
                    }
                }
                else{
                    echo "Says it's not writable: ".$dest_dir;
                }
            }
            else{//not a directory?
                echo "Says it's not a directory:".$dest_dir;
            }
        }
        else{
            echo "No file POSTED.\n";
        }
    }

Единственная ошибка, которую я получаю, - это $ _FILES ['Filedata'] ['error'] = 3, 'Только часть файла была загружена'. Каталог назначения имеет разрешение 777, и вы можете видеть, что я выполнил необходимые проверки. Это просто не сработает, понятия не имею почему. Кроме того, в файлах, которые я пытался загрузить, не было пробелов в имени файла, поэтому это не должно подходить под проблему 206 с SWFUpload.

Насколько я могу судить, это может быть связано либо с внешней SWFUpload, либо с конфигурацией внутреннего сервера. Пожалуйста помоги.

P.S. Нет необходимости упоминать о безопасности, это разрешено использовать только администратору сервера с внешним доступом, плюс есть ограничение внешнего интерфейса на файлы, которые он может выбирать (изображения). Дальше закреплять не было смысла.


person Nisk    schedule 04.11.2011    source источник
comment
Насколько велик загружаемый файл? Также сделайте это: ›_ 1_   -  person Mob    schedule 04.11.2011
comment
те, которые я пробовал, были около 200 КБ. Хорошо, сейчас попробую, спасибо.   -  person Nisk    schedule 04.11.2011
comment
Номер ошибки 3 возникает, когда загрузка была каким-то образом прервана.   -  person Mob    schedule 04.11.2011
comment
Как там вопрос :(   -  person Nisk    schedule 04.11.2011


Ответы (2)


Проблема на самом деле заключается в конфигурации сервера. Поскольку встроенный PHP не поддерживает частичную загрузку, вы должны неявно указать браузеру, что вы их не поддерживаете!

Вот несколько вариантов:

  • Настройте веб-сервер для отправки заголовка «Allow-Ranges: none» для всех запросов PHP.
  • Неявно закрывайте соединение после каждой загрузки. Добавьте header('Connection: close'); в сценарий на стороне сервера.
  • Отключите KeepAlives.
person h0tw1r3    schedule 25.04.2012

Оказывается, проблема была в самом SWFUpload, он просто не удался при использовании с серверами Linux. Тем, у кого есть подобные проблемы, рассмотрите возможность использования вместо этого этого:

смехотворно легко адаптируется, работает «из коробки», и вы можете легко настроить его по своему усмотрению. Я реализовал все, что хотел, менее чем за 20 минут, это чистое удовольствие от использования и хорошо работает. Красиво оформленный.

person Nisk    schedule 08.11.2011
comment
swfupload отлично работает с серверами Linux. Пожалуйста, не обвиняйте инструмент в том, что он не работает в вашем случае. - person rjha94; 08.11.2011
comment
@Nisk он работает на всех системах из коробки, потому что я использовал его на всех системах. - person zaf; 12.11.2011
comment
ну хочешь сказать, почему в этом случае не работает? Продолжать. Пожалуйста. - person Nisk; 12.11.2011
comment
Из одного только кода, указанного в OP, довольно сложно сказать, почему ваш сервер прерывает загрузку, и весь смысл использования SWFUpload поверх HTML5 заключается в том, что индикатор выполнения будет работать в старых браузерах, которые не поддерживают AJAX2. - person Esailija; 13.11.2011
comment
Нет. Приведенный выше интерфейсный код работает, я знаю это точно, потому что он отлично работал на хосте Windows. Бэкэнд-код выполняет все необходимые проверки и выдает ошибку, которая прямо говорит о том, что файл не был полностью загружен. Очевидно, что это неисправный компонент, SWFUpload. Если только вы не хотите обвинить моего хостинг-провайдера и их серверы (или Apache?). Честно говоря, возможно, проблема не столько в SWFUpload (который в любом случае далек от хорошего), сколько во флэш-памяти, поскольку она доступна на платформе Linux. Дело в том, что мы не знаем, что не так, я бы хотел знать. - person Nisk; 14.11.2011