【发布时间】:2011-08-05 01:54:49
【问题描述】:
我正在运行一个脚本,该脚本使用move_uploaded_file() 移动上传的文件。我已经这样做了数千次,但由于某种原因它不起作用。我已确认以下内容:
-
<form>使用method="post"并正确enctype - 从表单引用的正确文件
- 目录有权限
777 - 所有
memory_limit、max_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>';
}
通过 php.ini hack 使用 1and1 托管: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 意味着它在没有消息的情况下死掉了。有什么想法吗?
【问题讨论】:
-
尝试
print_r($_FILES);以查看完整的 FILES 数组。它可能包含错误代码。顺便说一句,您的错误消息实际上没有意义,因为您没有进行尺寸检查,并且 每个 错误条件都会返回“图像太大” -
文件名可能无效。那个文件密钥设置了吗?
-
如果您没有收到任何错误消息,请尝试使用
copy()而不是move_uploaded_file()。在这种情况下也可以查看error.log。 -
那个target_path看起来特别奇怪,是error_reporting在吗?
-
在
$_FILES['image']['tmp_name']和$target_path上尝试echoelse块以检查路径是否正确。
标签: php image-processing file-upload image-manipulation gd