从手机上传时图像旋转 90 度? PHP
Posted
技术标签:
【中文标题】从手机上传时图像旋转 90 度? PHP【英文标题】:Image rotating 90 degrees when uploaded from mobile? PHP 【发布时间】:2015-11-23 04:30:19 【问题描述】:我有一个网站,用户可以从手机上传照片,但所有从手机上传的照片在上传时都向左显示 90 度。直播网站是www.uneraportoj.com
。我现在的问题是exeif,但我尝试使用插件但无法正常工作。建议提供任何帮助。
分享脚本代码为:
<?php
include_once('help.php');
if(isset($_POST['submit']))
$title = $_POST['title'];
$content = $_POST['content'];
$posted = $_POST['posted'];
$date = date("Y-m-d H:i:s");
$ip = $_SERVER["REMOTE_ADDR"];
$rand = rand(1,1000000);
if(empty($title))
echo "Titulli eshte bosh.";
else if(empty($content))
echo "Permbajtja eshte bosh.";
else if(empty($_FILES['image']['name']))
echo "Imazhi eshte bosh.";
else if (
($_FILES['image']['type'] == 'image/gif')
|| ($_FILES['image']['type'] == 'image/jpeg')
|| ($_FILES['image']['type'] == 'image/pjpeg')
|| ($_FILES['image']['type'] == 'image/png')
&& ($_FILES['image']['size'] < 200000)
)
$part = $rand.'_'.$_FILES['image']['name'];
if ($_FILES["image"]["error"] > 0)
echo "return code" . $_FILES['image']['error'];
//Code from plugin start
if($_FILES['image'])
// If the image is jpg and has orientation data, make sure we orientate correctly before uploading
if($image->exif('Orientation'))
$image = orientate($image, $image->exif('Orientation'));
else if(move_uploaded_file($_FILES['image']['tmp_name'],'images/'. $part.''))
if(empty($posted))
$posted = 'Anonim';
$sql = "INSERT INTO ***(title, content, date, image, posted, ip) VALUES (:title, :content, :date, :image, :posted, :ip)";
$query = $db->prepare($sql);
$results = $query->execute(array(
':title' => htmlentities ($title),
':content' => htmlentities ($content),
':date' => $date,
':image' => $part,
':posted' => htmlentities ($posted),
':ip' => $ip
));
echo "<div id='ok'>Lajmi u raportua me sukses. Kontrollojeni <a href='index.php'>ketu</a> .</div>";
else
echo "<div id='ok'>Imazhi nuk eshte i sakte. (Vetem jpg/png)</div>";
?>
插件代码:
<?php /**
* Orientate an image, based on its exif rotation state
*
* @param Intervention\Image\Image $image
* @param integer $orientation Image exif orientation
* @return Intervention\Image\Image
*/
$image = $_FILES['image'];
function orientate($image, $orientation)
switch ($orientation)
// 888888
// 88
// 8888
// 88
// 88
case 1:
return $image;
// 888888
// 88
// 8888
// 88
// 88
case 2:
return $image->flip('h');
// 88
// 88
// 8888
// 88
// 888888
case 3:
return $image->rotate(180);
// 88
// 88
// 8888
// 88
// 888888
case 4:
return $image->rotate(180)->flip('h');
// 8888888888
// 88 88
// 88
case 5:
return $image->rotate(-90)->flip('h');
// 88
// 88 88
// 8888888888
case 6:
return $image->rotate(-90);
// 88
// 88 88
// 8888888888
case 7:
return $image->rotate(-90)->flip('v');
// 8888888888
// 88 88
// 88
case 8:
return $image->rotate(90);
default:
return $image;
?>
【问题讨论】:
我需要提一下,您应该在所有$_POST
数据上使用 htmlspecialchars()
,例如$title = htmlspecialchars($_POST['title']);
正如你现在所拥有的那样,你正面临着巨大的安全威胁。
【参考方案1】:
我发现这个 youtube 视频对使用 exif 数据的图像方向非常有帮助 看看这个 https://www.youtube.com/watch?v=HjHSgGFqAtE
print 'exif orientation';
$original_filename = 'car1.jpg';
$exif_data = exif_read_data($original_filename);
// displays exif data
// print '<pre>';
// print_r($exif_data);
// print '<pre>';
$orientation = orientation($exif_data);
$degrees = orientation_flag($orientation);
print '<pre>';
print_r($orientation);
print '</pre>';
print '<pre>';
print_r($degrees);
print '</pre>';
$image_data = imagecreatefromjpeg($original_filename);
$image_rotate = imagerotate($image_data, $degrees, 0);
$rotated_filename = 'rotated_' . $original_filename;
imagejpeg($image_rotate, $rotated_filename);
imagedestroy($image_data);
imagedestroy($image_rotate);
// finds orientation value in exif data
function orientation($exif_data)
// search array for orientation
foreach($exif_data as $key => $val)
// print '<pre>';
// print_r($key);
// print '<pre>';
if(strtolower($key) == 'orientation')
return $val;
// gets orientation data and returns degrees needed for rotation
function orientation_flag($orientation)
switch($orientation):
case 1:
return 0;
case 8:
return 90;
case 3:
return 180;
case 6:
return 270;
endswitch;
?>
<img src="car1.jpg" />
<br>
<img src="rotated_car1.jpg" />
【讨论】:
【参考方案2】:你的函数调用在 if(error) 语句下,这意味着它只会在出现错误时轮换。在您的图像通过错误检查并将其移动到最终位置后放置它。
if ($_FILES["image"]["error"] > 0)
echo "return code" . $_FILES['image']['error'];
else if(move_uploaded_file($_FILES['image']'tmp_name'],'images/'. $part.''))
if(file_exists('images/'. $part.''))
/* read exif data (returns it as an array) */
$exif_read = exif_read_data('images/'. $part.'');
/* if exif contains orientation property (some images don't) */
if(!empty($exif_read['Orientation']))
$orientation_data = $exif_read['Orientation'];
$image = orientate($image, $Orientation_data);
编辑:
我复制并粘贴了用于上传图片的确切代码。对于我正在做的事情,我只需要担心方向 3、6 和 8,但如果您认为需要它们,可以添加其余部分。在 imagerotate() 之后使用 PHP 的 imageflip() 函数(阅读如何使用 here)
<?php
require("../db_credentials.php");
if($_FILES['file']['name'])
$name = htmlspecialchars($_FILES['file']['name']);
$ext = end((explode(".", $name)));
$ext = strtolower($ext);
//if no errors...
if(!$_FILES['file']['error'])
//now is the time to modify the future file name and validate the file
$new_file_name = date('ymdHisu'). ".". $ext;
if($_FILES['file']['size'] > (6144000))
$valid_file = false;
echo 'Oops! Your file\'s size is to large.';
elseif($ext !== "jpg" && $ext !== "png" && $ext !== "jpeg" && $ext != "gif" && $ext !== "bmp")
$valid_file = false;
echo "Your file must be in jpg, jpeg, png, gif, or bmp formats.";
else
$valid_file = true;
//if the file has passed the test
if($valid_file)
//move it to where we want it to be
move_uploaded_file($_FILES['file']['tmp_name'], 'images/'.$new_file_name);
$exif_read = exif_read_data("images/".$new_file_name);
if(!empty($exif_read['Orientation']))
$orientation_data = exif_read_data("images/".$new_file_name)['Orientation'];
if(isset($orientation_data) && $orientation_data !== 1)
$path = "../images/". $new_file_name;
$buffer = ImageCreateFromJPEG($path);
$exif = exif_read_data($path);
if(!empty($exif['Orientation']))
switch($exif['Orientation'])
case 8:
$buffer = imagerotate($buffer,90,0);
break;
case 3:
$buffer = imagerotate($buffer,180,0);
break;
case 6:
$buffer = imagerotate($buffer,-90,0);
break;
imagejpeg($buffer, $path, 90);
//if there is an error...
else
//set that to be the returned message
echo 'Ooops! Your upload triggered the following error: '.$_FILES['file']['error'];
?>
【讨论】:
您好,我收到以下错误:'致命错误:在第 37 行的 /home/henrimma/public_html/php/shareScript.php 中的非对象上调用成员函数 exif()感谢您的帮助 我第一次错过了。我用我编写和使用的软件中的一些代码更新了我的答案。问题是代码试图调用一个不存在的函数“exif()”。读取exif数据的函数是'exif_read_data()',它将所有数据作为一个数组返回。您可以在php.net/manual/en/book.exif.php 阅读更多相关信息 你有什么问题?它返回什么错误? 我编辑了我的答案并添加了我正在使用的完整代码。 我似乎无法让它为我工作。我们可以互相发送电子邮件,也许您可以访问我的网站并尝试解决此问题。谢谢@frostycoles以上是关于从手机上传时图像旋转 90 度? PHP的主要内容,如果未能解决你的问题,请参考以下文章
Ipad上传的图像在asp.net c#中的所有浏览器中显示桌面旋转90度