解决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 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
PHP.MVC的模板标签系统(二)
Sep 05 PHP
透析PHP的配置文件php.ini
Oct 09 PHP
用PHP和ACCESS写聊天室(十)
Oct 09 PHP
php简单封装了一些常用JS操作
Feb 25 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
基于php中使用excel的简单介绍
Aug 02 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php如何连接sql server
Oct 16 PHP
php实现简单的上传进度条
Nov 17 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 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中遍历stdclass object的实现代码
2011/06/09 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
解决FLASH需要点击激活的代码
2006/12/20 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
如何通过python实现人脸识别验证
2020/01/17 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Weblogic的布署方式
2013/08/23 面试题
4s客服专员岗位职责
2013/12/01 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
租房协议书范本
2014/04/09 职场文书
文体活动总结范文
2014/05/05 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL