首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >下载PHP渲染图像-无法在Android手机上打开

下载PHP渲染图像-无法在Android手机上打开
EN

Stack Overflow用户
提问于 2018-06-05 04:07:39
回答 1查看 43关注 0票数 0

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

所以图像不是打开的,而是由浏览器下载的。效果很好。

但是,当我在android手机上下载图像时,在下载之后,我无法从浏览器/文件查看器打开图像。但是,在我的画廊中,图像是存在的,我可以打开它。浏览器(chrome)无法将下载的文件识别为图像。

希望任何人都有一个想法。也许是和文件头有关的东西?

我用submit form按钮调用脚本,然后文件就变成了downloaden,而您却停留在同一页上。

代码语言:javascript
复制
<?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);

?>

编辑:以某种方式,当我删除这一行时,它就可以工作了:

代码语言:javascript
复制
header("Content-type: application/".$ext);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:47:07

在脚本的开头,您会说内容类型是image/jpeg,然后在脚本的结尾,您会说内容类型是application/".$ext

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

此外,根据你从哪里得到这个图像文件,我会比仅仅检查扩展名更小心。至少交叉检查文件中的magic numbers,并交叉引用该文件的扩展名。使用Image Magick将您从用户那里获得的图像复制到空白图像中可能是一个好主意。您可以使用它来删除无关的元数据,并防止某些类型的漏洞。

Some more information on the Content-Type header

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档