【问题标题】:SWFUpload image upload fails on PHP with 'Partial File Uploaded'在 PHP 上 SWFUpload 图像上传失败,“部分文件已上传”
【发布时间】:2023-03-09 19:50:01
【问题描述】:

好的,这是一个艰难的问题,我已经花了几个小时寻找解决方案/问题。我正在使用 SWFUpload 上传图像而不重新加载页面(也有一个花哨的进度条),当我在本地主机(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;}'
                };

上传.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, 'Only part of the file was uploaded'。目标目录确实有 777 权限,你可以看到我做了必要的检查。它根本行不通,我不知道为什么。此外,我尝试上传的文件的文件名中没有空格,因此不适合 SWFUpload 的问题 206。

据我所知,这可能是由于前端 SWFUpload 或后端服务器配置所致。请帮忙。

附:无需提及安全性,无论如何,这仅允许具有外部访问权限的服务器管理员使用,而且他可以选择的文件(图像)有前端限制。没有必要进一步保护它。

【问题讨论】:

  • 您上传的文件有多大?也这样做:>echo ini_get("upload_max_filesize");
  • 我试过的大约是 200kB。好的,我现在试试,谢谢。
  • 错误号3是在上传被某种方式中断时发生的。
  • 问题如何 :(

标签: php linux flash file-upload swfupload


【解决方案1】:

问题实际上是服务器配置。由于内置 PHP 不支持将部分上传放在一起,因此您必须隐式告诉浏览器您不支持它们!

这里有几个选项:

  • 配置网络服务器为所有 PHP 请求发送标头“Allow-Ranges: none”。
  • 在每次上传后隐式关闭连接。将header('Connection: close'); 添加到服务器端脚本。
  • 关闭 KeepAlives。

【讨论】:

    【解决方案2】:

    所以问题出在 SWFUpload 本身,它在与 linux 服务器一起使用时就失败了。对于有类似问题的任何人,请考虑改用this

    非常容易适应,开箱即用,您可以根据自己的喜好轻松自定义它。 我在 20 分钟内实现了我想要的一切,使用起来非常愉快并且运行良好。设计精美。

    【讨论】:

    • swfupload 适用于 linux 服务器。请不要责怪该工具,因为它不适用于您的情况。
    • @Nisk 它可以在所有系统上开箱即用,因为我在所有系统上都使用过它。
    • 好吧,想告诉我为什么它在这种情况下不起作用?继续。请。
    • 仅从 OP 中列出的代码很难判断为什么您的服务器会中断下载,而在 HTML5 上使用 SWFUpload 的全部意义在于进度条将在不支持的旧浏览器中工作AJAX2
    • 没有。上面的前端代码有效,这是我知道的事实,因为它在 Windows 主机上运行良好。后端代码进行所有必要的检查,并给出一个错误,很清楚地说“文件没有完全上传”。有问题的组件是什么很明显,SWFUpload。除非您想将责任归咎于我的托管服务提供商及其服务器(或 Apache?)。公平地说,问题可能不在于 SWFUpload(无论哪种方式,它都还远远不够好),而是闪存在 linux 平台上可用。事实是,我们不知道出了什么问题,我希望我知道。
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2012-07-24
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多