我正在学习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 } ?>
答案 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;结尾并且只包含小写字母和 - 字符