解决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 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
php与php MySQL 之间的关系
Jul 17 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 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使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python爬取个性签名的方法
2018/06/17 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
python颜色随机生成器的实例代码
2020/01/10 Python
关于Django Models CharField 参数说明
2020/03/31 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
python全栈开发语法总结
2020/11/22 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
四个太阳教学反思
2014/02/01 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
诚信承诺书范文
2014/03/27 职场文书
一年级评语大全
2014/04/23 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
超市店长竞聘书
2015/09/15 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
golang 实用库gotable的具体使用
2021/07/01 Golang