下载 PHP 渲染图像 - 无法在 Android phone 上打开

Download PHP rendered image - not able to open on Android phone

我正在使用脚本来: 1. render/save 我服务器上的图片。 2. 将保存的图像作为下载提供给浏览器。

所以图片不是打开的,而是浏览器下载的。完美运行。

但是当我在 android phone 上下载图像时,下载后我无法从 browser/file 查看器打开图像。但是,在我的画廊中,图像存在并且我可以打开它。看起来浏览器 (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);

在你的脚本开头你说内容类型是 image/jpeg 然后在最后你说内容类型是 application/".$ext.

为了您的目的,您需要将 Content-Type 设置为 image/$etc,以便浏览器将其解释为正确的 MIME 类型。 Here's a list of common MIME types.

此外,根据您从何处获取此图像文件,我会比仅检查扩展名更加小心。至少交叉检查 magic numbers inside the file and cross reference this with the extension. It's probably a good idea to use Image Magick 以将从用户那里获得的图像复制到空白图像中。您可以使用它来删除无关的元数据并防止某些类型的攻击。

Some more information on the Content-Type header