move_uploaded_file不起作用,没有错误

时间:2011-04-13 21:26:13

标签: php image-processing file-upload image-manipulation gd

我正在运行一个脚本,用move_uploaded_file()移动上传的文件。我做了好几千次,但由于某种原因,它不起作用。我已经克服了以下内容:

  1. <form>使用method="post"并更正enctype
  2. 从表格
  3. 引用的正确文件
  4. 目录具有权限777
  5. 所有memory_limitmax_execution_time等设置为超高设置以避免超时
  6. 基本上,下面的脚本只返回Your image is too big.。我还启用了所有错误,但仍然没有出现错误。有什么想法吗?

    $time = time();
    $target_path = "/absolute/path/to/temp/directory/temp/";
    
    $target_path = $target_path.$time.'.jpg'; 
    
    if(move_uploaded_file($_FILES['image']['tmp_name'], $target_path)) {            
    
    } else{
            $error .= '<li>Your image is too big.</li>';
    }
    

    使用1和1托管与php.ini hack:P

    更新1

    我想补充说,脚本的响应恰好在60秒后发生。

    更新2

    我们可能会遇到这个问题。只需print_r($_FILES),这就是数组的结果:

    Array ( 
        [image] => Array ( 
            [name] => P2120267.JPG 
            [type] => 
            [tmp_name] => 
            [error] => 1 
            [size] => 0 
        ) 
    ) 
    

    这是让我相信文件没有正确上传到服务器或其他东西?我查了一下,帖子表格是<form action="" method="post" enctype="multipart/form-data">。那么,据我所知,该文件没有上传到服务器的临时区域?

    更新3

    注意到上面数组中的[error] => 1。这显然低至the filesize being larger than the upload_max_filesize。但是,当我将其设置为128M时,我会在60秒后获得白色死亡屏幕。我上传的文件是2.5MB

    这是我的php.ini文件:

    register_globals=off
    memory_limit = 128M 
    max_execution_time=3600 
    post_max_size = 128M
    upload_max_filesize= 128M 
    

    更新4

    有了上面的详细信息,我似乎得到了一个WSOD,但图像正在被上传。那么,如何阻止WSOD?我找不到任何相关的错误。

    更新5 - 找到它!

    因为我没有给你们所有的代码而感到羞耻。看起来它与这一行有关:

    resizeImage($feedBurnerStatsSource, PHOTOMSGDIR.'temp/'.$time.'-tmp.jpg',$width,$height);
    

    在以下代码中:

    function resizeImage($source, $destination = NULL,$wdt, $height = NULL){
        if(empty($height)){
                // Height is nit set so we are keeping the same aspect ratio.
                list($width, $height) = getimagesize($source);
                if($width > $height){
                        $w = $wdt;
                        $h = ($height / $width) * $w;
                        $w = $w;
                }else{
                        $w = $wdt;
                        $h = $w;
                        $w = ($width / $height) * $w;
                }
        }else{
                // Both width and Height are set.
                // this will reshape to the new sizes.
                $w = $wdt;
                $h = $height;
        }
        $source_image = @file_get_contents($source) or die('Could not open'.$source);
        $source_image = @imagecreatefromstring($source_image) or die($source.' is not a valid image');
        $sw = imagesx($source_image);
        $sh = imagesy($source_image);
        $ar = $sw/$sh;
        $tar = $w/$h;
        if($ar >= $tar){
                $x1 = round(($sw - ($sw * ($tar/$ar)))/2);
                $x2 = round($sw * ($tar/$ar));
                $y1 = 0;
                $y2 = $sh;
        }else{
                $x1 = 0;
                $y1 = 0;
                $x2 = $sw;
                $y2 = round($sw/$tar);
        }
        $slate = @imagecreatetruecolor($w, $h) or die('Invalid thumbnail dimmensions');
        imagecopyresampled($slate, $source_image, 0, 0, $x1, $y1, $w, $h, $x2, $y2);
        // If $destination is not set this will output the raw image to the browser and not save the file
        if(!$destination) header('Content-type: image/jpeg');
        @imagejpeg($slate, $destination, 75) or die('Directory permission problem');
        ImageDestroy($slate);
        ImageDestroy($source_image);
        if(!$destination) exit;
        return true;
    }
    

    所以,WSOD意味着它的某种模具没有消息。有什么想法吗?

5 个答案:

答案 0 :(得分:10)

只是验证post_max_filesize是否设置为高级别?因为根据php.net:

  

如果发布数据的大小大于post_max_size,则$ _POST和$ _FILES超全局变量为空。可以通过各种方式对其进行跟踪,例如:将$_GET变量传递给处理数据的脚本,即<form action="edit.php?processed=1">,然后检查是否设置了$_GET['processed']

需要考虑的事情。

有关详细信息,请参阅this link并向下滚动到post_max_filesize部分

<强>更新

根据我的经验,如果您正在获得WSOD,通常会关闭error_reportingdisplay_errors或者memory_limit到达。在顶部的脚本中,我通常将memory_limit设置为1024M以验证问题并且启用error_reportingdisplay_errors ...所以在文件上传之前将其设置为:

error_reporting(E_ALL); // or E_STRICT
ini_set("display_errors",1);
ini_set("memory_limit","1024M");

这通常会摆脱WSOD并让你和错误一起工作。

<强>更新

您是否尝试在所有功能面前取消@错误抑制,以查看它们是否产生了特定错误?你还有什么执行和输入超时?你能验证发送的标题吗? (确保它是Content-Type=text/html;

答案 1 :(得分:3)

尝试将目标路径更改为非临时目录。

此处的一些更新是解决方案:

set_time_limit(0);
ini_set('upload_max_filesize', '500M');
ini_set('post_max_size', '500M');
ini_set('max_input_time', 4000); // Play with the values
ini_set('max_execution_time', 4000); // Play with the values

...将其添加到处理上传文件的开头。

答案 2 :(得分:1)

[error] => 1表示上传的文件超出了php.ini中的upload_max_filesize指令。
http://www.php.net/manual/en/features.file-upload.errors.php

因此,您必须更改设置。

对于你在这里发布的php.ini文件,它不会影响你的PHP。你必须将它移动到更合适的位置

答案 3 :(得分:0)

上周我遇到了同样的问题,那只是因为我的服务器空间磁盘已经满了!我希望它会帮助别人...

答案 4 :(得分:0)

我有同样的问题,但我想覆盖一个文件,所以我必须删除旧文件,而不是它的工作原理。