带有'image / pjpeg'mime类型的图像不能通过PHP使用GD库显示

时间:2014-05-15 01:09:50

标签: php image jpeg

我正在学习PHP&我正在使用Apress PHP书籍进行简单的上传和显示图像练习。我正在使用最新的Eclipse程序,XAMPP,Apache等......

我遇到的问题是上传的图片是JPEG,但它被读作PJPEG类型。它使用我的错误消息将IF语句推送到FALSE部分。

如果我将所有条件更改为pjpeg,那么由于某种原因,我会得到奇怪的原始代码而不是图片。

如何确保加载的图片保留为jpeg,或者如何重写代码以上传和输出pjpeg并实际显示在浏览器中。

更新:Jake提供的代码正在运行,但图片本身并未在浏览器中显示。在Chrome,Firefox和IE中测试过。

<?php 

error_reporting(E_ALL);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    if ( isset($_FILES['photo']) && 
        is_uploaded_file($_FILES['photo']['tmp_name']) && 
        $_FILES['photo']['error']==UPLOAD_ERR_OK ){

            if ($_FILES['photo']['type'] == 'image/jpeg'){

                $j = imagecreatefromjpeg($_FILES['photo']['tmp_name']);

                header('Content-Type: image/jpeg'); 

                imagejpeg($j);

                imagedestroy($j);

            } else {
                echo "Uploaded file was not a jpeg. <br />";
                echo "The file ", $_FILES['photo']['name'], " uploaded was a ", $_FILES['photo']['type'];
            }
    } else {
        echo "No photo upload"; 
    }
} else {

?>

<form action="test.php" method="post" enctype="multipart/form-data">
    <label for="photo">User Photo:</label>
    <input type="file" name="photo" />
    <input type="submit" name="submit" value = "Upload a JPEG" />
</form>

<?php } ?>

2 个答案:

答案 0 :(得分:1)

更改此代码:

if ($_FILES['photo']['type'] == 'image/jpeg'){
    $j = imagecreatefromjpeg($_FILES['photo']['tmp_name']);
    header('Content-Type: image/jpeg'); 
    imagejpeg($j);
    imagedestroy($j);
}

对此:

// Set an array of mime types that you accept as valid.
$valid_photo_mime_types = array('image/jpeg', 'image/pjpeg');

// Now check if the mime type of the uploaded file matches your array values of valid photo mime types.
if (in_array($_FILES['photo']['type'], $valid_photo_mime_types)){

    // Now let’s ingest the file that was uploaded & assign it to $j using the GD graphics library.
    $j = imagecreatefromjpeg($_FILES['photo']['tmp_name']);

    // Set the header to be whatever the uploaded file mime-type is.
    header('Content-Type: ' . $_FILES['photo']['type']); 

    // Now send the image to the browser.
    imagejpeg($j);

    // And finally 'destroy' the stored image to free up memory.
    imagedestroy($j);

}

请注意,我放弃了原始示例中空格的双行间距。在我的重写中,我设置了一个名为$photo_mime_types的数组,然后使用in_array检查$_FILES['photo']['type']是否与$photo_mime_types中的值匹配。那么对于header('Content-Type: '…,我将其设置为$_FILES['photo']['type']的值,因为此时该值有效,是否正确?好的编程就是避免重复,所以当我们知道有效时,让我们只传递有效的东西。

编辑:这似乎仍然不适用于原始海报,因此另一个调试的想法是检查从命令行通过curl -I发送的标头。不确定你是否可以在Windows上执行此操作,但如果没有,你应该弄清楚如何,因为curl是一个很好的调试工具,用于这样的事情。在Mac OS X计算机或Unix / Linux机器上运行此命令。例如,立即调用Google上的图片徽标:

curl -I https://www.google.com/images/srpr/logo11w.png

我得到的输出如下:

HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 14022
Last-Modified: Wed, 09 Oct 2013 01:35:39 GMT
Date: Thu, 15 May 2014 01:47:25 GMT
Expires: Thu, 15 May 2014 01:47:25 GMT
Cache-Control: private, max-age=31536000
X-Content-Type-Options: nosniff
Server: sffe
X-XSS-Protection: 1; mode=block
Alternate-Protocol: 443:quic

这些是与该图像一起发送的所有标题,告诉浏览器如何处理图像。请注意Content-Type: image/png。现在只需将URL替换为本地PHP代码,而不是Google URL&amp;检查输出。另请参阅this answer on Stack Overflow。同样as this one that explains how to use getimagesize以获取有关PHP代码中图像的数据。 getimagesize也很有用,可以向您展示PHP看到的数据。

答案 1 :(得分:0)

变化

if ($_FILES['photo']['type'] == 'image/jpeg'){

if (preg_match('@^image/[a-z\-]jpeg@',$_FILES['photo']['type']) === true) {

这将匹配以&#39; image /&#39;开头的任何类型并以&#39; jpeg&#39;结尾并且只包含小写字母和 - 字符

相关问题