首页 > PHP教程 > php开发知识文章

PHP 上传Progressive JPEG图片(pjpeg)的方法

本文主要介绍了PHP 上传Progressive JPEG图片(pjpeg)的方法的相关资料,需要的朋友可以参考下。

JPEG文件两种保存方式分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式)。

两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别是二者显示的方式不同

Baseline JPEG

这种类型的JPEG文件存储方式是按从上到下的扫描方式,把每一行顺序的保存在JPEG文件中。

打开这个文件时,数据将按照存储时的顺序从上到下一行一行的被显示出来,直到所有的数据都被读完,完成图片的显示。

如果文件较大或者网络下载速度较慢,就会看到图片被一行行加载的效果

 

Progressive JPEG

和Baseline一遍扫描不同,Progressive JPEG文件包含多次扫描,这些扫描顺寻的存储在JPEG文件中。

打开文件过程中,会先显示整个图片的模糊轮廓,随着扫描次数的增加,图片变得越来越清晰。

这种格式的主要优点是在网络较慢的情况下,看到图片的轮廓知道正在加载的图片大概是什么。

 

PHP 上传Progressive JPEG图片

php上传pjpeg图片测试,上传完成后页面提示:

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

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

解决方法

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

gd.jpeg_ignore_warning = 1

在 MIME 类型中有 image/jpeg 与 image/pjpeg 两种,GD库只认识前者的传统格式

 

PHP多图片文件上传类

支持gif、jpg、jpeg、pjpeg、png格式的多图片上传功能,类中能限制图片类型、上传图片大小、设置上传目录、一些提交判断等功能。

本类也能上传其它类型的文件,具体代码:

class Upload
{
const FILE_PATH = '/upload/';//默认文件上传的目录,请自行修改
public $file_type;
public $file_type_array;
public $file_type_real_array;
public $file_type_string;
public $file_name;
public $file_size;
public $file_tmp_name;
public $file_error;
public $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 上传Progressive JPEG图片(pjpeg)的方法的全部内容,欢迎大家的学习。

PHP 上传Progressive JPEG图片(pjpeg)的方法

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。