move_uploaded_file不起作用,没有错误
image-manipulation
image-processing
php
4
0

我正在运行一个脚本,该脚本使用move_uploaded_file()移动上载的文件。我已经完成了数千次,但是由于某种原因,它无法正常工作。我已确认以下内容:

  1. <form>使用method="post"和正确的enctype
  2. 表格中引用的正确文件
  3. 目录具有权限777
  4. 所有memory_limitmax_execution_time等均设置为超高设置,以避免超时

基本上,下面的脚本仅返回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>';
}

将1and1托管与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 。显然, 这取决于文件大小大于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意味着它没有消息就死了。有任何想法吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

只是要验证post_max_filesize设置为较高水平?因为根据php.net:

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

需要考虑的事情。

有关更多信息,请参见此链接并向下滚动至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;

收藏
评论

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

经过一些更新后,这里是解决方法:

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号