Maison > développement back-end > tutoriel php > Introduction détaillée pour résoudre le problème du téléchargement PHP d'images au format non standard, partage de la méthode d'échec pjpeg

Introduction détaillée pour résoudre le problème du téléchargement PHP d'images au format non standard, partage de la méthode d'échec pjpeg

黄舟
Libérer: 2023-03-06 15:18:02
original
1527 Les gens l'ont consulté

Cet article présente principalement des informations pertinentes sur la façon de résoudre le problème de l'échec du téléchargement PHP d'images au format pjpeg non standard. Les amis dans le besoin peuvent s'y référer

Il y a quelque temps, le site Web a ajouté un nouvel album photo. fonction, mais récemment, j'ai toujours trouvé que certains liens vers des fichiers image téléchargés par les utilisateurs n'étaient pas valides. J'ai vérifié le code plusieurs fois et effectué suffisamment de tests, mais le problème de l'échec du téléchargement persiste. Je suis finalement très déprimé. trouvé une solution aujourd'hui.

J'ai trouvé l'image JPG que l'utilisateur n'a pas réussi à télécharger à partir de la source de sauvegarde et j'ai effectué un test de téléchargement. Une fois le téléchargement terminé, la page a demandé :

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

Cet avertissement semble dû. à la fonction GDLa détection de la bibliothèque a révélé que cela était dû à un format d'image JPEG non standard.

Solution, si version PHP > 5.1.3, vous pouvez l'ajouter dans php.ini :

gd.jpeg_ignore_warning = 1
Copier après la connexion

Il y a image/jpeg et image/pjpeg dans le type MIME Il en existe deux types. La bibliothèque GD ne reconnaît que le format traditionnel du premier, et le second est l'abréviation de JPEG progressif. Quel est le surnom de pjpeg ?

De plus, je joins une classe de téléchargement de fichiers PHP multi-images pratique , qui prend en charge plusieurs fonctions de téléchargement d'images aux formats gif, jpg, jpeg, pjpeg et png. être limité dans la classe, télécharger la taille de l'image, définir le répertoire de téléchargement, certains jugements de soumission et d'autres fonctions. En fait, cette catégorie ne se limite pas au téléchargement d'images. Vous pouvez également télécharger des types de fichiers tels que TXT/RAR. Il vous suffit de modifier le code. Je pense que vous pouvez le gérer :
<. 🎜>


<?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;
}
}
?>
Copier après la connexion
Vous pouvez copier le code dans un fichier PHP, enregistrer le nom du fichier : more_upload_file.class.php et utiliser

include.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal