Home  >  Article  >  Backend Development  >  Detailed introduction to solve the problem of PHP uploading non-standard format pictures pjpeg failure method sharing

Detailed introduction to solve the problem of PHP uploading non-standard format pictures pjpeg failure method sharing

黄舟
黄舟Original
2017-03-13 16:39:441468browse

This article mainly introduces relevant information on how to solve the problem of PHP uploading non-standard format pictures pjpeg failure. Friends in need can refer to it

A while ago, the website added a new photo album function, but recently it has always been I found that some links to image files uploaded by users are invalid. I have checked the code many times and done sufficient testing, but the problem of upload failure still occurs. I am very depressed. I finally found a solution today.

Found the JPG image that the user failed to upload from the backup source, and performed an upload test. After the upload was completed, the page prompted:

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

This Warning appears due to the GD function library The detection found that it was caused by the non-standard JPEG image format.

Solution, if PHP version > 5.1.3, you can add in php.ini:

gd.jpeg_ignore_warning = 1

There are two types of MIME types: image/jpeg and image/pjpeg , the GD library only recognizes the traditional format of the former, and the latter is the abbreviation of progressive JPEG. What is the nickname of pjpeg?

In addition, I attach a practical PHP multi-image File upload class, which supports the multi-image upload function in gif, jpg, jpeg, pjpeg, and png formats. The image type can be limited in the class , upload image size, set upload directory, some submission judgment and other functions. In fact, this category is not limited to uploading images. You can also upload file types such as TXT/RAR. You just need to modify the code. I believe you can handle it. The specific code is posted below:


<?php 
class more_file_upload{
const FILE_PATH=&#39;/uploadfile/&#39;;//默认文件上传的目录,请自行修改
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(&#39;m-d-Y&#39;);
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(&#39;/&#39;, &#39;image/gif&#39;, &#39;image/jpg&#39;, &#39;image/jpeg&#39;, &#39;image/pjpeg&#39;, &#39;image/png&#39;);
this->file_type_real_array = array(0.1, &#39;jpg&#39;=>74707370, &#39;gif&#39;=>7173, &#39;bmp&#39;=>6677, &#39;png&#39;=>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=&#39;<strong>文件超过服务器的约定大小!</strong>&#39;;break;
case 2: smfilemessage=&#39;<strong>文件超过指定的文件大小!</strong>&#39;;break;
case 3: smfilemessage=&#39;<strong>文件只上传了部分!</strong>&#39;;break;
case 4: echo "this->file_name ".&#39;文件上传失败!<br/>&#39;;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[&#39;chars1&#39;].strInfo[&#39;chars2&#39;]);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
if(smfiletypeflag == false){ //判断是否是png图片
typeCode = intval(strInfo[&#39;chars2&#39;].strInfo[&#39;chars3&#39;].strInfo[&#39;chars4&#39;]);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
if(smfiletypeflag == false){ //判断是否是jpg图片
$typeCode = intval(strInfo[&#39;chars7&#39;].strInfo[&#39;chars8&#39;].strInfo[&#39;chars9&#39;].strInfo[&#39;chars10&#39;]);
smfiletypeflag = array_search(typeCode, this->file_type_real_array);
}
}
}
if($smfiletypeflag == false){
$smfilemessage=&#39;<strong>文件类型不对,请核实!</strong>&#39;;
self::destruct();
}else{
$resflag = $this->move_file($this->file_tmp_name,this->file_name);
if (resflag == 1){
$smfilemessage = &#39;文件上传成功!&#39;;
self::totalsize +=intval($smfilesize);
self::destruct();
}else{
$smfilemessage = &#39;<strong>文件上传失败!</strong>&#39;;
self::destruct();
}
}
}
$smfilesizeformat = $this->size_BKM(smfilesize);
echo &#39;<tr>
<td align="left" >&#39;.smfilename.&#39;</td>
<td align="center" >&#39;.smfiletype.&#39;</td>
<td align="center" >&#39;.smfilesizeformat.&#39;</td>
<td align="center" >&#39;.smfilemessage.&#39;</td>
</tr>&#39;;
}
function move_file(mvfiletmp,mvfilename){ //移动文件
mvfilenamearr = explode(&#39;.&#39;,basename(mvfilename));
mvfilenamearr[0] = this->rand_string();
mvfilename = implode(&#39;.&#39;,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;
}
}
?>

You can copy the code into a PHP file, save the file name: more_upload_file.class.php, and include when using it.

The above is the detailed content of Detailed introduction to solve the problem of PHP uploading non-standard format pictures pjpeg failure method sharing. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn