解决PHP上传非标准格式的图片pjpeg失败的方法


Posted in PHP onMarch 12, 2017

前一阵子网站新上了相册功能,可最近总发现有一些用户上传的图片文件链接失效,代码检查了很多次,测试也做的比较充分了,但还是会出现上传失败的问题,很是郁闷,今天终于找到了解决办法。

从备份源中找到了用户上传失败的JPG图片,进行上传测试,上传完成后页面提示:

Warning: imagecreatefromjpeg(): ‘/tmp/lalala' is not a valid JPEG file in /path/upload.php on line 1

出现这个Warning是由于GD函数库检测发现是非标准JPEG图片格式导致。

解决方法,如果PHP版本 > 5.1.3,可以在php.ini中增加:

gd.jpeg_ignore_warning = 1

在 MIME 类型中有 image/jpeg 与 image/pjpeg 两种,GD库只认识前者的传统格式,后者是 progressive JPEG 的缩写,啥是pjpeg昵?

这个链接中有详细的解释:

http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html

另外,php.net 中也有相关问题的详细讨论,有兴趣的朋友可以进去看看:

http://bugs.php.net/bug.php?id=29878

另外给大家附上一个实用的PHP多图片文件上传类,支持gif、jpg、jpeg、pjpeg、png格式的多图片上传功能,类中可限制图片类型、上传图片大小、设置上传目录、一些提交判断等功能。其实本类不局限于图片的上传,也可以上传TXT/RAR等文件类型,只是要修饰一下代码,相信你能搞定,下面帖出具体代码:

<?php 
class more_file_upload{
const FILE_PATH='/uploadfile/';//默认文件上传的目录,请自行修改
var file_type;
var file_type_array;
var file_type_real_array;
var file_type_string;
var file_name;
var file_size;
var file_tmp_name;
var file_error;
var handledate;
static totalsize=0;
function __construct(file_name,file_error,file_size,file_tmp_name,file_type){
this->handledate=date('m-d-Y');
if (!empty(file_name)){
this->file_name = file_name;
this->file_error = file_error;
this->file_size = file_size;
this->file_tmp_name = file_tmp_name;
this->file_type = file_type;
this->file_type_array = array('/', 'image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png');
this->file_type_real_array = array(0.1, 'jpg'=>74707370, 'gif'=>7173, 'bmp'=>6677, 'png'=>807871);
this->show_execute_message(this->file_error,this->file_name,this->file_type,this->file_size);
}
}
function __destruct(){
this->file_name = NULL;
this->file_error = NULL;
this->file_size = NULL;
this->file_tmp_name = NULL;
this->file_type = NULL;
self::totalsize = 0;
}
function show_execute_message(smfileerror,smfilename,smfiletype,smfilesize){
if(smfileerror>0){
switch (smfileerror){
case 1: smfilemessage='<strong>文件超过服务器的约定大小!</strong>';break;
case 2: smfilemessage='<strong>文件超过指定的文件大小!</strong>';break;
case 3: smfilemessage='<strong>文件只上传了部分!</strong>';break;
case 4: echo "this->file_name ".'文件上传失败!<br/>';break;
}
self::__destruct();
}else{
smfiletypeflag = array_search(smfiletype,this->file_type_array);
//进行真实格式验证
if(smfiletypeflag != false){
file = fopen(this->file_tmp_name, "rb");
bin = fread(file, 10);
fclose(file);
strInfo = @unpack("c10chars", bin);
typeCode = intval(strInfo['chars1'].strInfo['chars2']);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
if(smfiletypeflag == false){ //判断是否是png图片
typeCode = intval(strInfo['chars2'].strInfo['chars3'].strInfo['chars4']);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
if(smfiletypeflag == false){ //判断是否是jpg图片
$typeCode = intval(strInfo['chars7'].strInfo['chars8'].strInfo['chars9'].strInfo['chars10']);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
}
}
}
if($smfiletypeflag == false){
$smfilemessage='<strong>文件类型不对,请核实!</strong>';
self::__destruct();
}else{
$resflag = $this->move_file($this->file_tmp_name,this->file_name);
if (resflag == 1){
$smfilemessage = '文件上传成功!';
self::totalsize +=intval($smfilesize);
self::__destruct();
}else{
$smfilemessage = '<strong>文件上传失败!</strong>';
self::__destruct();
}
}
}
$smfilesizeformat = $this->size_BKM(smfilesize);
echo '<tr>
<td align="left" >'.smfilename.'</td>
<td align="center" >'.smfiletype.'</td>
<td align="center" >'.smfilesizeformat.'</td>
<td align="center" >'.smfilemessage.'</td>
</tr>';
}
function move_file(mvfiletmp,mvfilename){ //移动文件
mvfilenamearr = explode('.',basename(mvfilename));
mvfilenamearr[0] = this->rand_string();
mvfilename = implode('.',mvfilenamearr);
if (is_uploaded_file(mvfiletmp)){
uploadfile = self::FILE_PATH."mvfilename";
result = move_uploaded_file(mvfiletmp,uploadfile);
return result;
}
}
function rand_string(){
string = md5(uniqid(rand().microtime()));
return string;
}
function size_BKM(size){ // B/KB/MB单位转换
if(size < 1024)
{
size_BKM = (string)size . " B";
}
elseif(size < (1024 * 1024))
{
size_BKM = number_format((double)(size / 1024), 1) . " KB";
}else
{
size_BKM = number_format((double)(size / (1024*1024)),1)." MB";
}
return size_BKM;
}
}
?>

可将代码复制到PHP文件中,保存文件名为:more_upload_file.class.php,使用时include。

PHP 相关文章推荐
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
Oct 09 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP编码规范-php coding standard
Mar 16 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
php分页示例分享
Apr 30 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
PHP7 新特性详细介绍
Sep 06 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 #PHP
php pdo操作数据库示例
Mar 10 #PHP
yii2简单使用less代替css示例
Mar 10 #PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 #PHP
Yii2.0中使用js异步删除示例
Mar 10 #PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 #PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 #PHP
You might like
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
php学习笔记之面向对象
2014/11/08 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
javascript回调函数详解
2018/02/06 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
单位门卫岗位职责
2013/12/20 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
课外小组活动总结
2014/08/27 职场文书
给校长的一封检讨书
2014/09/20 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
Python实现拼音转换
2021/06/07 Python
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
浅谈Python中对象是如何被调用的
2022/04/06 Python