我有一种方法来保存图像,这意味着优雅地处理错误,在发生故障时将$ imageSrc设置为特定图像。如果图像存在,我的方法可以正常工作,但似乎没有正确处理错误条件。
$imageSrc = save_pic($PIC_URL, $pk);
function save_pic($pic_url, $pk) {
$imageDir = './';
if (!strlen($pic_url))
return "removed.jpg";
if (!is_dir($imageDir) || !is_writable($imageDir)) {
return "removed.jpg";
}
$image = file_get_contents($pic_url);
if (empty($image)) {
return "removed.jpg";
}
$r = file_put_contents($imageDir.$pk.".jpg", $image);
if ($r) {
return "./$pk.jpg";
} else {
return "removed.jpg";
}
}
如果图像不存在,我会得到:
Warning: getimagesize(http://127.0.0.1/555.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in C:\Program Files\EasyPHP 2.0b1\www\get_auction.php on line 144
Array (
[type] => 2 [message] => getimagesize(http://127.0.0.1/555.jpg)
function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
[file] => C:\Program Files\EasyPHP 2.0b1\www\get_auction.php
[line] => 144
) 1
在任何情况下,return.jpg都不会被退回。
编辑:添加了imageResize代码:
function imageResize($imageURL, $maxWidth, $maxHeight)
{
global $outputWidth, $outputHeight, $maxWidth, $maxHeight;
$size = getimagesize($imageURL);
if ($size) {
$imageWidth = $size[0];
$imageHeight = $size[1];
$wRatio = $imageWidth / $maxWidth;
$hRatio = $imageHeight / $maxHeight;
$maxRatio = max($wRatio, $hRatio);
if ($maxRatio > 1) {
$outputWidth = $imageWidth / $maxRatio;
$outputHeight = $imageHeight / $maxRatio;
} else {
$outputWidth = $imageWidth;
$outputHeight = $imageHeight;
}
} else {
die(print_r(error_get_last()));
}
}
答案 0 :(得分:0)
您确定要写入根文件夹吗?因为我看不到你的代码有任何问题。 file_get_contents
和file_put_contents
似乎没有失败,因此您的图像正在某处写入。
答案 1 :(得分:0)
$image = file_get_contents("http://example.com/test.png");
list($ver, $retcode, $message) = explode(' ', $http_response_header[0], 3);
if ($retcode != 200) {
return "removed.jpg";
}
$retcode
将包含HTTP
响应代码。
请在此处发布此$retcode
以及strlen($image)
返回的内容,这可能有助于解决您的问题。
答案 2 :(得分:0)
试试这个:
<?php
$imageSrc = save_pic($PIC_URL, $pk);
function save_pic($pic_url, $pk)
{
$imageDir = './';
if (!strlen($pic_url))
{
return 'removed.jpg';
}
if(!is_dir($imageDir) || !is_writable($imageDir))
{
return 'removed.jpg';
}
if(!file_exists($pic_url))
{
return 'removed.jpg';
}
if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url)))
{
return $imageDir . $pk . '.jpg';
}
else
{
return 'removed.jpg';
}
}
答案 3 :(得分:0)
调试?
获取一个包含调试器的IDE,如Eclipse或Netbeans,rtm,用于查看响应方式的函数,或者执行错误的内联调试以在运行时回显代码的值。
答案 4 :(得分:0)
在我看来,你没有发布完整的代码?
警告消息显示getimagesize()
,但您的示例中没有使用getimagsize()
。为了获得更好的帮助,我将包括您当前工作的整个方法或更新的错误消息。还请包括您正在使用的PHP版本。
file_get_contents()
将在出现错误时返回false,并在404 HTTP错误上返回false,如下所示:
mfischer@testing01:~$ php -r 'var_dump(file_get_contents("http://stackoverflow.com/i_do_not_exist.jpg"));'
Warning: file_get_contents(http://stackoverflow.com/i_do_not_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in Command line code on line 1
Call Stack:
0.0002 51884 1. {main}() Command line code:0
0.0002 51952 2. file_get_contents() Command line code:1
bool(false)
mfischer@testing01:~$ php -v
PHP 5.2.6-5 with Suhosin-Patch 0.9.6.2 (cli) (built: Oct 5 2008 13:07:13)
试用你的代码,这对我来说非常合适:
$ cat test.php
<?php
$PIC_URL="http://stackoverflow.com/i_dont_exist.jpg";
$pk = "test";
$imageSrc = save_pic($PIC_URL, $pk);
var_dump($imageSrc);
function save_pic($pic_url, $pk) {
$imageDir = './';
if (!strlen($pic_url))
return "removed.jpg";
if (!is_dir($imageDir) || !is_writable($imageDir)) {
return "removed.jpg";
}
$image = file_get_contents($pic_url);
if (empty($image)) {
return "removed.jpg";
}
$r = file_put_contents($imageDir.$pk.".jpg", $image);
if ($r) {
return "./$pk.jpg";
} else {
return "removed.jpg";
}
}
$ php test.php
Warning: file_get_contents(http://stackoverflow.com/i_dont_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in /home/mfischer/tmp/532480/test.php on line 14
Call Stack:
0.0005 59824 1. {main}() /home/mfischer/tmp/532480/test.php:0
0.0005 60176 2. save_pic() /home/mfischer/tmp/532480/test.php:4
0.0006 60444 3. file_get_contents() /home/mfischer/tmp/532480/test.php:14
string(11) "removed.jpg"
PHP函数有一个坏习惯,就是在代码中直接发出警告消息,如果你不喜欢这样,你可以按照之前建议的'@'操作来使它们静音,或者你也可以使用HTTP Client库作为由PEAR_HTTP或Zend_HTTP_Client提供,以更好地控制错误处理。用套接字,fsockopen等滚动自己的东西也是可能的。
但回到这一点:如果它仍然不起作用,我认为缺少一些信息。
答案 5 :(得分:0)
您是否应该测试file_get_contents错误?我的意思是像
if( false == ($image = file_get_contents($pic_url))){
return "removed.jpg";
}
答案 6 :(得分:0)
答案 7 :(得分:0)
您遇到路径问题。您应该在定义中存储pic的完整路径。
确保此文件来自save_pic函数。
DEFINE("RemovedPicUrl", "http://" . $_SERVER['SERVER_NAME'] . "/path/to/removed/image/removed.jpg")
然后改变所有出现的
"Removed.jpg"
到
RemovedPicUrl
我敢打赌你能用一美元解决你的问题。
答案 8 :(得分:0)
问题不是代码问题,而是由文件损坏引起的。这是在其他机器上测试时确定的。