Загрузить рендеринг изображения PHP — не удается открыть на телефоне Android

Я использую скрипт для:
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);

0

Решение

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

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

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

Еще немного информации о заголовке Content-Type

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]