Загрузить изображение с поддержкой PHP - не удается открыть на телефоне Android - PullRequest
0 голосов
/ 04 июня 2018

Я использую скрипт для: 1. рендеринга / сохранения изображения на моем сервере.2. предоставить сохраненное изображение для загрузки в браузер.

Таким образом, изображение не открывается, а загружается браузером.Работает отлично.

Но когда я загружаю изображение на телефон Android, после загрузки я не могу открыть изображение из браузера / средства просмотра файлов.Тем не менее, в моей галерее изображение присутствует, и я могу открыть его.Похоже, что браузер (chrome) не распознает загруженный файл как изображение.

Надеюсь, у кого-нибудь есть идея.Может быть, что-то с заголовками файлов?

Я вызываю скрипт с помощью кнопки отправки формы, и затем файл загружается, пока вы остаетесь на той же странице.

<?php

// #######################  Part 1, Render the image #######################

//content type
 header('Content-type: image/jpeg'); 
//font
$font = 'assets/medium.otf';
//font size
$font_size = 16;
//image width
$width = 400;
//text margin
$margin = 15;

//text
 $text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';

//explode text by words
$text_a = explode(' ', $text);
$text_new = '';
foreach($text_a as $word){
    //Create a new text, add the word, and calculate the parameters of the text
    $box = imagettfbbox($font_size, 0, $font, $text_new.' '.$word);
    //if the line fits to the specified width, then add the word with a space, if not then add word with new line
    if($box[2] > $width - $margin*2){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
}
//trip spaces
$text_new = trim($text_new);
//new text box parameters
$box = imagettfbbox($font_size, 0, $font, $text_new);
//new text height
$height = $box[1] + $font_size + $margin * 2;

//create image
$im = imagecreatetruecolor($width, $height);

//create colors
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
//color image
imagefilledrectangle($im, 0, 0, $width, $height, $white);

//add text to image
imagettftext($im, $font_size, 0, $margin, $font_size+$margin, $black, $font, $text_new);

//return image
//imagejpeg($im);
  imagejpeg($im,'images/text/name.jpg');
//frees any memory associated with image
imagedestroy($im);



// #######################  Part 2, download the image #######################

$file = 'images/text/name.jpg';

header("Expires: 0");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$ext = pathinfo($file, PATHINFO_EXTENSION);
$basename = pathinfo($file, PATHINFO_BASENAME);

header("Content-type: application/".$ext);
// tell file size
header('Content-length: '.filesize($file));
// set file name
header("Content-Disposition: attachment; filename=\"$basename\"");
readfile($file);

?>

РЕДАКТИРОВАТЬ: Как-то, когда я удаляю эту строку, то это работает:

header("Content-type: application/".$ext);

1 Ответ

0 голосов
/ 05 июня 2018

В начале вашего сценария вы говорите, что тип контента image/jpeg, а затем в конце вы говорите, что тип контента application/".$ext.

Для ваших целей вы 'Вы захотите установить Content-Type на image/$etc, чтобы браузер интерпретировал его как правильный тип MIME. Вот список распространенных типов MIME .

Кроме того, в зависимости от того, откуда вы получаете эти файлы изображений, я был бы более осторожен, чем просто проверял расширение.По крайней мере, перекрестная проверка магические числа внутри файла и перекрестная ссылка с расширением.Вероятно, будет хорошей идеей использовать Image Magick , чтобы скопировать изображение, полученное от пользователя, в пустое изображение.Вы можете использовать это для удаления посторонних метаданных и предотвращения некоторых типов эксплойтов.

Дополнительная информация о заголовке Content-Type

...