在使用PHP上传之前,根据EXIF方向对图像进行方向

时间:2019-01-07 12:33:53

标签: php exif capture

我知道这个话题对大多数人来说可能很容易,但是我在过去的两天里一直在努力,没有任何进展。

我正在为自己开发一个Web应用程序,因为它不是用于生产的,所以不需要安全性。

以下脚本工作正常,当我使用以下方法直接从相机上传图片时,问题仍然存在:

events(id,event_date)

当我从浏览器上载时,一切正常,但是从智能手机上,服务器不遵守EXIF方向,因此图像旋转错误。

每次上传时,我使用以下脚本:(还提供了astebin)。

https://pastebin.com/mvgah9Ud

<input
id="photoBox"
type="file"
class="form-control-file"
accept="image/*"
capture="camera"
name="photo"/>

我的意图很明确。在上传之前,请按照EXIF方向旋转img,然后将其存储在磁盘上。 如果可能的话,我打算使用完全相同的function photoPlant($pID){ // db include "includes/dbConfig.php"; // init $out = null; // gen hash $varA = microtime(); $varB = time(); $varC = $varA . $varB; $hash = md5($varC); // prepare upload $currentDir = getcwd(); $uploadDirectory = "/gallery/"; $errors = []; // Store all foreseen and unforseen errors here $fileExtensions = ['jpeg','jpg','png', '']; // Get all the file extensions, including empty for mobile // reformat empty file extension if ($fileExtension === ""){ $fileExtension = "jpg"; } $fileName = $_FILES['photo']['name']; $fileTmpName = $_FILES['photo']['tmp_name']; $fileSize = $_FILES['photo']['size']; $fileType = $_FILES['photo']['type']; $fileExtension = strtolower(end(explode('.',$fileName))); // reformat filename $fileName = $hash . "." . $fileExtension; $uploadPath = $currentDir . $uploadDirectory . basename($fileName); if (! in_array($fileExtension,$fileExtensions)) { $errors[] = "This file extension is not allowed. Please upload a JPEG or PNG file"; } if ($fileSize > 8000000) { $errors[] = "This file is more than 8MB. Sorry, it has to be less than or equal to 8MB"; } if (empty($errors)) { $didUpload = move_uploaded_file($fileTmpName, $uploadPath); if ($didUpload) { $out .= "ok"; // everything is ok give feedback ok } else { $out .= "An error occurred somewhere. Try again or contact the admin"; } } else { foreach ($errors as $error) { $out .= $error . "These are the errors" . "\n"; } } // store img on db // prepare data $timeStamp = time(); // query $query = mysqli_query($con, "INSERT INTO photo_table (photo_parent_id, photo_name, photo_timestamp) VALUES ($pID, '$fileName', $timeStamp)"); // run query if (!$query){ $out = mysqli_error($con); } // return return $out; } 函数。

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧。经过几次无法解释的投票和DinoCoderSaurus的非常有用的评论之后,这就是我一直在寻找的答案。

我必须安装并启用 Imagick for PHP7 。 这不是一件简单的工作,但是有一些适用于Google的指南。根据您的版本/操作系统,安装说明会不同,因此请谨慎操作。

我的上传功能(来自原始帖子)已在上传部分更改。 上面写着:

if (empty($errors)){
// old code here.
}

它已更改为以下验证:

if (empty($errors)) {
    // this is my new validation code.
    $img = new Imagick($fileTmpName);
    $orient = $img->getImageOrientation();
    if($orient === 6){
        // we need to rotate it 90deg
        $img->rotateImage("rgba(255, 255, 255, 0.0)", 90);
    }
    if ($orient === 3){
        // we need to rotate it 180deg
        $img->rotateImage("rgba(255, 255, 255, 0.0)", 180);
    }
    // Note that imagick does the storage for me as well!
    $img->writeImage("gallery/" . $fileName);
}
else{
    $out .= "Errors on upload";
}

这以合理的响应时间解决了我的所有问题。 希望像我这样的新手可以从这篇文章中获得一些技能上的好处。

作为告别记录,我需要添加...如果您对某篇文章投反对票,请评论您这样做的原因,因为该主题已经在这里讨论了无数次,但是经过2天的SO老文章研究后,我没有设法找到为什么不起作用!

特别感谢DinoCoderSaurus,他用大约10个单词向正确的方向发送了我。