【发布时间】:2011-09-15 01:20:02
【问题描述】:
我遇到了网络上传问题。如下:
我上传一张图片并查找类型(允许的 jpeg、jpg、gif 和 png)。现在我从中剪下一部分并将其保存在由类型信息创建的临时资源中(如果类型是 jpg 或 jpeg,我使用 imagejpeg(),PNG 我使用 imagepng(),gif 我使用 imagegif())。现在这行得通。然后我再次保存图像。
然后我通过 imagecreatefromjpeg/-png/-gif 重新打开它们。然后我得到错误
Warning: imagecreatefromgif() [function.imagecreatefromgif]: 'uploads/gif/test.gif' is not a valid GIF file in /home/blabla/sliceit.php on line 88
第 88 行如下所示:
$org_img = 'uploads/' . $name . "/" . $rand . (substr($type,0,1) != "." ? "." . $type : $type);
...
87: elseif ($type == ".gif") {
88: $src_img = imagecreatefromgif($org_img);
89: }
同样的错误也发生在png,但不是jpeg(因为我在开头写了以下语句:
ini_set('gd.jpeg_ignore_warning', 1);
)。 Jpeg 警告似乎已停用,但 png 和 gif 的警告却没有。我用 mspaint 创建了图像,所以它们实际上必须是有效的。
感谢您的帮助。
弗洛
编辑:一些代码:
$name = 'something';
$filetype = substr($_FILES['datei']['name'],-4,4);
$filetype = strtolower($filetype);
$randomsessid = randomstring(60);
mkdir('uploads/' . $name);
move_uploaded_file($_FILES['datei']['tmp_name'],'uploads/' . $name . '/' . $randomsessid . (substr($filetype,0,1) == "." ? $filetype : "." . $filetype));
mysql_query("INSERT INTO SESSIONS VALUES('','" . $name . "','" . $randomsessid . "','" . strtolower($filetype) . "'," . time() . ")");
所以现在我保存了文件和表格中的信息。
现在我正在链接到另一个文件...
$id = mysql_real_escape_string($_GET["randid"]); //here I get the randomstring
if ($id == "") {
exit;
}
$unf = mysql_query("SELECT NAME, TYP FROM SESSIONS WHERE RANDOM = '" . $id . "'");
if (mysql_num_rows($unf) == 1) {
$f = mysql_fetch_object($unf);
$name = $f->NAME;
$filetype = $f->TYP;
}
else {
exit;
}
$image_resize = new image_resize; //this is a very useful class to resize images
$size = $_GET["size"]; //here is 'auto' inside
$log->debug('size: ' . $size);
if ($size == "custom" and isset($_GET["x"]) and isset($_GET["y"])) {
//blabla some code...
}
else {
$image_resize->load("uploads/" . $name . "/" . $id . (substr($filetype,0,1) == "." ? $filetype : "." . $filetype));
$image_resize->resize(600,600);
$image_resize->save("uploads/" . $name . "/" . $id . (substr($filetype,0,1) == "." ? $filetype : "." . $filetype));
}
现在是另一个重定向 ....
ini_set('gd.jpeg_ignore_warning', 1);
$id = $_GET["randid"];
if ($id == "") {
exit;
}
$tempsel = "SELECT * FROM SESSIONS WHERE RANDOM = '" . $id . "'";
$unf = mysql_query($tempsel);
if (mysql_num_rows($unf) != 1) {
$log->debug('tempsel: ' . $tempsel);
exit;
}
$f = mysql_fetch_object($unf);
$name = $f->NAME;
$type = $f->TYP;
for ($i = 1; $i <= 9; $i++) {
createImagePart($i,$name,$type,$id,$log); //$i = for loop, $name = the name from the beginning, $type defined, $id = random id, $log = a previously defined log class.
}
以及调用函数createImagePartI():
function createImagePart($nr,$name,$type,$id,$log) {
if (!isFolderSet($id . "/parts/")) {
mkdir("uploads/" . $id );
mkdir("uploads/" . $id . "/parts");
}
//prepare params....
$org_img = 'uploads/' . $name . "/" . $id . (substr($type,0,1) != "." ? "." . $type : $type);
$dst_img = 'uploads/' . $id . "/parts/" . $nr . (substr($type,0,1) != "." ? "." . $type : $type);
$tmp_img = imagecreatetruecolor(200, 200);
if ($type == ".jpg" or $type == "jpeg") {
$src_img = imagecreatefromjpeg($org_img);
}
elseif ($type == ".png") {
$src_img = imagecreatefrompng($org_img);
}
elseif ($type == ".gif") {
$src_img = imagecreatefromgif($org_img);
}
else {
exit;
}
$sX = ($nr-1)%3 * 200; //// watch this question:
$sY = floor(($nr-1)/3) * 200; //// http://stackoverflow.com/questions/6325169/variable-has-unexpected-value
imagecopy($tmp_img, $src_img, 0,0, $sX, $sY, 200, 200);
if ($type == ".jpg" or $type == "jpeg") {
imagejpeg($tmp_img, $dst_img,100); // because of ini_set i dont get an error here
}
elseif ($type == ".png") {
imagepng($tmp_img, $dst_img, 0); //on these functions, I get the errors
}
else {
imagegif($tmp_img, $dst_img); //also here i get an error
}
imagedestroy($tmp_img);
}
【问题讨论】:
-
你确定图片存在吗?
-
$org_img真的指向一个现有的图像文件吗? (也许有错字什么的?);此外,最好使用getimagesize()进行类型检测,因为它既有助于区分大小写,又有助于检查实际内容而不是文件扩展名。 -
我建议用一种类型的图像做一个清晰的例子。在您的代码示例中,
$type看起来让我有点困惑。 -
可以用文本编辑器打开图片文件,检查开头是否有(PHP)错误。
-
所以,我确定图像存在。我正在写这样的类型,因为在这个字段中是一个有四个字符长的字符串,它可能是'.jpg',但也可能是'jpeg',所以我必须确定一个点。