Сбой загрузки изображения SWFUpload на PHP с 'Partial File Uploaded' - PullRequest
0 голосов
/ 04 ноября 2011

Хорошо, так что это сложный вопрос, я часами искал решение / проблему. Я использую 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. не нужно упоминать о безопасности, это разрешено использовать только администратору сервера с внешним доступом в любом случае, плюс есть ограничение внешнего интерфейса для файлов, которые он может выбрать (изображения). Не было никакого смысла защищать его дальше.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2012

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

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

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

Получается, что проблема была в самой SWFUpload, она просто не работала при использовании с серверами linux.Любому, у кого есть подобные проблемы, рассмотрите возможность использования this вместо:

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

...