Я работаю над некоторым программным обеспечением для галереи, но у меня проблема, Orientation 'в данных EXIF после загрузки изображения всегда устанавливается в 1 (что означает «ничего не делать») независимо от ориентации изображения. Это означает, что я не могу получить изображение, отображаемое с правильной ориентацией.Загрузка изображения JPEG через HTML-форму и PHP-скрипт, похоже, устанавливает флаг ориентации в данных EXIF в 1 (или полностью лишает его)
Вот характерные части моей форме загрузки:
<form id="Upload" name="Upload" action="http://www.goosedalemodelflyingclub.co.uk/index.php" enctype="multipart/form-data" method="post">
...
<div class="uploadbox">
<label>Choose photo to upload:<input id="file_upload1" type="file" name="file_upload1" accept="image/*"></label>
<br>
<label>Name of Photo: (1) <span id="new_msg_name1"></span><br><input type="text" class="p_name" size="60" maxlength="40" id="new_name1" name="new_name1" value=""></label>
<br>
<label>Description:
<span id="new_msg_desc1"></span><br>
<textarea id="new_desc1" name="new_desc1" class="p_desc" rows="4" cols="70" maxlength="250" style="width: auto; height: auto;"></textarea>
</label>
<br>
<label>Who is able to view this picture:
<select id="albpic_visib_upload1" name="albpic_visib_upload1">
<option value="O">Me only</option>
<option value="G">Forum only</option>
<option value="W">Everyone</option>
</select>
</label>
<br><br>
<input type="submit" onclick="return validateUploadForm(this)" id="NewPix1" name="NewPix1" value="Upload Photos to Current Album">
<a href="#">
<input type="button" name="cncl" id="cncl" value="Cancel">
</a>
<br>
</div>
...
<input type="hidden" id="p" name="p" value="MyGallery">
<input type="hidden" id="override" name="override" value="Y">
<input type="hidden" id="albumid" name="albumid" value="54321">
<input type="hidden" id="gfunc" name="gfunc" value="NewPix1">
<input type="hidden" id="pix_this_upload" name="pix_this_upload" value="15">
<input type="hidden" id="user_id_passed" name="user_id_passed" value="12345"></div>
</form>
У меня есть ряд подразделений, имеющих класс «Uploadbox», чтобы ряд фотографий, которые будут загружены на один раз (как указано на pix_this_upload, может быть или не быть 15). Функция JavaScript validateUploadForm() не имеет отношения к действительности - все, что она делает, это проверить правильность заполнения полей и сообщить пользователю, есть ли что-то неправильное.
Соответствующий раздел моего PHP скрипт выглядит следующим образом (в том числе для отладки отчетов, чтобы помочь мне добраться до нижней части этого):
$formfiles = $request->file("file_upload$ii");
$tempfile = $formfiles['tmp_name']; // Temporary name of file (uploaded as)
...
$uploaded = @move_uploaded_file($tempfile, $fullpath); // Move the uploaded file to its permanent home and rename appropriately
...
$exif = exif_read_data($fullpath); // Get EXIF data
/*** DEBUG start ***/
$ff = $this->picsrootaddr;
$ff .= "application_$pictureid.log";
$debug_r = fopen($ff, "w");
fwrite($debug_r, "$path_o\n");
$xxr = print_r(array_values($exif), true);
fwrite($debug_r, "Debug 0: " . $xxr . "\n\n");
/*** DEBUG end for now ***/
if (isset($exif['Orientation']))
{
$orientation = isset($exif['Orientation']); // Orientation
fwrite($debug_r, "Debug 1: $orientation\n");
}
else
{
if (isset($exif['IDF0']['Orientation']))
{
$orientation = $exif['IDF0']['Orientation']; // Orientation
fwrite($debug_r, "Debug 2: $orientation\n");
}
else
{
$orientation = EXIF_NOTHING; // Leave image as-is
fwrite($debug_r, "Debug 3: $orientation\n");
}
}
/*** DEBUG start ***/
fclose($debug_r);
/*** DEBUG end ***/
Это довольно трудно разместить весь код, как некоторые из них в функции, и происходит много проверок (is_uploaded_file и т. д.). Кроме того, может быть примечательно, что сайт использует phpBB3, и это блокирует доступ к суперглобалам в PHP, следовательно, использование этого объекта $ request. Это экземпляр phpBB3 сам, поэтому все, что мне нужно сделать, это использовать его.
Вот ссылка на фото, которые я загрузил с помощью сценария (переехал в зону ожидания, чтобы не мешать моему тестирование): http://www.goosedalemodelflyingclub.co.uk/gallery_aux/original/43/pic176_DSCF4678.JPG
Вот ссылка на скрипт в Интернет, которые я что отображает его данные EXIF: http://regex.info/exif.cgi?imgurl=http%3A%2F%2Fwww.goosedalemodelflyingclub.co.uk%2Fgallery_aux%2Foriginal%2F43%2Fpic176_DSCF4678.JPG Обратите внимание, что данные EXIF не включают ориентацию и, по-видимому, сильно удалены.
Это файл журнала EXIF производится отладки кода я добавил, чтобы распечатать данные EXIF в файле: http://www.goosedalemodelflyingclub.co.uk/gallery_aux/application_176.log Обратите внимание, как флаг «Ориентация» в настоящее время сообщается, как 1.
Я загрузил ту же картину непосредственно с помощью FileZilla здесь: http://www.goosedalemodelflyingclub.co.uk/stackoverflow/DSCF4678.JPG Обратите внимание, как она отображается с правильной ориентацией (в Google Chrome, так или иначе)
А вот его отчет EXIF данные с того же сайта: http://regex.info/exif.cgi?dummy=on&imgurl=http%3A%2F%2Fwww.goosedalemodelflyingclub.co.uk%2Fstackoverflow%2FDSCF4678.JPG
Таким образом, где-то вдоль линии данные EXIF теряются, что означает, что у меня нет шансов повернуть или перевернуть изображение, чтобы оно отображалось правильно.
Может кто-нибудь дать мне руль в правильном направлении здесь, пожалуйста? Я догадался об этом до смерти, и это привело к бесчисленным статьям, учебникам и вопросам, которые по существу указывают на то, что я не делаю ничего плохого.
PPS: Похож на аналогичный вопрос здесь, если не тот же, но ответа нет: No orientation in exif data - PHP image upload - и все о iOS.
whats '$ path_o'? не должно быть '$ fullpath'? – cmorrissey
Вы правы - плохо C & P с моей стороны. Это потому, что этот бит находится в функции, о которой я говорил. Благодаря! –
TLDR - сократите описание и добавьте еще код – cmorrissey