2016-06-03 1 views
0

Я работаю над некоторым программным обеспечением для галереи, но у меня проблема, 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">&nbsp;&nbsp; 
<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.

+0

whats '$ path_o'? не должно быть '$ fullpath'? – cmorrissey

+0

Вы правы - плохо C & P с моей стороны. Это потому, что этот бит находится в функции, о которой я говорил. Благодаря! –

+0

TLDR - сократите описание и добавьте еще код – cmorrissey

ответ

0

Нашел ответ на этот вопрос, и спасибо всем, кто посмотрел на него. Проблема была не в том, чтобы прочитать документацию с моей стороны.

В PHP, метод ImageFlip() возвращает логическое значение, чтобы сказать, было ли оно успешным или нет, и изменяет изображение передается в качестве параметра в месте: https://secure.php.net/manual/en/function.imageflip.php

Тем не менее, imagerotate() возвращает ресурс для повернутого изображения и оставляет оригинал неизменным: https://secure.php.net/manual/en/functi ... rotate.php

ошибку я делал думал, что imagerotate() возвращала успех/провал булеву и модифицировали изображение на месте, как ImageFlip(), но это не так.

Думал, что стоит опубликовать это на случай, если кто-нибудь обнаружит этот вопрос и захочет попытаться ответить на него, а также не дать кому-либо еще попасть в ту же ловушку.

Ошибка была ни в одном из моих опубликованных кодов - это было в другом месте.

Смежные вопросы