php - 下载 PHP 渲染图像 - 无法在 Android 手机上打开
问题描述
我使用脚本来: 1. 在我的服务器上渲染/保存图像。2. 提供保存的图像作为下载到浏览器。
所以图像不是打开的,而是由浏览器下载的。完美运行。
但是当我在安卓手机上下载图像时,下载后我无法从浏览器/文件查看器中打开图像。但是,在我的画廊中,图像存在,我可以打开它。看起来浏览器(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 类型。这是常见 MIME 类型的列表。
此外,根据您从何处获取此图像文件,我会比仅检查扩展名更加小心。至少交叉检查文件中的幻数并将其与扩展名交叉引用。使用Image Magick将您从用户那里获得的图像复制到空白图像中可能是一个好主意。您可以使用它来删除无关的元数据并防止某些类型的漏洞利用。
推荐阅读
- ios - UISearchBar 文本在 rtl 语言上不是从右到左开始
- javascript - 我需要 bindActionCreators 吗?
- android-studio - 模拟器:模拟器:错误:检测到挂起的线程“QEMU2 主循环”。15000 毫秒无响应
- java - Spring Boot - Streaming Apache FileUpload - 流意外结束
- jquery - Bootstrap Collapse:如何停用其他按钮?
- wso2 - 在 Wso2 esb 中如何使用 mqtt 发布消息
- typescript - 使用泛型类型混淆 TypeScript 错误
- ruby-on-rails - 水豚,rspec 出现“未定义的方法访问”错误
- elasticsearch - logstash 将搜索结果限制为过去一天
- c# - 没有 MessageBox,C# DLL 不起作用