2011-04-15 6 views
1

J'ai le code suivant pour télécharger un fichier sur le serveur. Pour une raison étrange, cela ne fonctionne pas dans IE et Mozilla Firefox, mais fonctionne parfaitement dans Chrome. Quel est le problème?Téléchargement de fichier ne fonctionne pas dans IE et Firefox

PHP:

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762) 
    $POST_MAX_SIZE = ini_get('post_max_size'); 
    $unit = strtoupper(substr($POST_MAX_SIZE, -1)); 
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1))); 

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) 
     HandleError('File exceeded maximum allowed size. Your file size <b>MUST NOT</b> be more than 100kb.'); 

// Settings 
    $save_path = 'uploads/'; //getcwd() . '/uploads/';The path were we will save the file (getcwd() may not be reliable and should be tested in your environment) 
    $upload_name = 'userfile';       // change this accordingly 
    $max_file_size_in_bytes = 102400;    // 100k in bytes 
    $whitelist = array('jpg', 'png', 'gif', 'jpeg'); // Allowed file extensions 
    $blacklist = array('php', 'php3', 'php4', 'phtml','exe','txt','scr','cgi','pl','shtml'); // Restrict file extensions 
    $valid_chars_regex = 'A-Za-z0-9_-\s ';// Characters allowed in the file name (in a Regular Expression format) 

// Other variables 
    $MAX_FILENAME_LENGTH = 260; 
    $file_name = $_FILES[$upload_name]['name']; 
    //echo "testing-".$file_name."<br>"; 
    //$file_name = strtolower($file_name); 
    ////////$file_extension = end(explode('.', $file_name)); 

    $parts = explode('.', $file_name); 
    $file_extension = end($parts); 

    $uploadErrors = array(
     0=>'There is no error, the file uploaded with success', 
     1=>'The uploaded file exceeds the upload max filesize allowed.', 
     2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', 
     3=>'The uploaded file was only partially uploaded', 
     4=>'No file was uploaded', 
     6=>'Missing a temporary folder' 
    ); 

// Validate the upload 
    if (!isset($_FILES[$upload_name])) 


     **HandleError('No upload found for ' . $upload_name);**//THROWS UP ERROR HERE in IE and Firefox 


    else if (isset($_FILES[$upload_name]['error']) && $_FILES[$upload_name]['error'] != 0) 
     HandleError($uploadErrors[$_FILES[$upload_name]['error']]); 
    else if (!isset($_FILES[$upload_name]['tmp_name']) || [email protected]_uploaded_file($_FILES[$upload_name]['tmp_name'])) 
     HandleError('Upload failed.'); 
    else if (!isset($_FILES[$upload_name]['name'])) 
     HandleError('File has no name.'); 

HTML:

<form name="upload" action="/upload" method="POST" ENCTYPE="multipart/formdata"> 
     <table border="0" cellpadding="3" cellspacing="3" class="forms"> 
      <tr> 
      <tr> 
      <td style="height: 26px" align="center"> 
<font class="font_upload_picture">'.MSG142.': <input class="font_upload_picture" type="file" name="userfile"> 
<input type=hidden name=MAX_FILE_SIZE value=102400 /> 
      </td> 
      </tr> 
      <tr> 
      <td colspan="2"> 
        <p align="center"> 
           <input type="image" name="upload" value="upload" src="/img/layout/btnupload.gif" border="0" /> 
           </p> 
           <p>&nbsp;</p> 
           <td><a href="/picturecamerasettings"><img src="/img/layout/takepicture.gif" border="0" /><br> '.MSG143.'</a></td> 
           </tr> 
     </table> 
     </form> 
+3

S'il vous plaît inclure le balisage pour la forme. – Sean

+0

Pouvez-vous afficher le formulaire de téléchargement? Aussi, quelle erreur obtenez-vous du système? – Wige

+0

En outre, quels sont les symptômes que vous voyez dans IE et Firefox? Est-ce l'une des erreurs de votre extrait de code? Ou est-ce que ça bloque ou jette un code d'erreur HTTP? –

Répondre

5

Le enctype du formulaire doit être multipart/form-data

+1

ah, bon oeil ^^ c'est probablement le problème –

+0

Que puis-je faire pour vous? C'est le problème. 5 étoiles à toi. Curieux cependant pourquoi il travaillait dans Chrome .. ??? –

+1

boire une bière en mon honneur ^^ –

0

Vous avez des erreurs dans votre code HTML. Il vous manque des balises de fermeture pour une balise tr et td. En outre, fermez la balise d'entrée de téléchargement de fichier />.

0

Une partie de votre logique est désactivée:

if (!isset($_FILES[$upload_name])) 

passera toujours. Pour chaque <input type="file"> dans votre formulaire, il y aura une entrée correspondante $_FILES, si un fichier a été téléchargé ou non. Si aucun fichier n'a été chargé pour être avec, vous obtiendrez le code d'erreur 4.

else if (isset($_FILES[$upload_name]['error']) && $_FILES[$upload_name]['error'] != 0) 

Il n'est pas nécessaire de vérifier si le paramètre d'erreur est défini. Tant que $upload_name a un nom de champ de fichier valide, la section error sera là. Vous pouvez vérifier $_FILES[$upload_name], cependant. au cas où votre variable est mal réglée.

Vous l'avez commenté, mais vous vérifiez les types de téléchargement valides en vérifiant le nom de fichier fourni par l'utilisateur. Rappelez-vous que les paramètres ['type'] et ['name'] dans $ _FILES sont fournis par l'utilisateur et peuvent être subvertis. Rien ne dit qu'un utilisateur malveillant ne peut pas renommer bad_virus.exe en cute_puppies.jpg et passer votre vérification de 'validation'. Toujours déterminer le type MIME sur le serveur, en utilisant quelque chose comme Fileinfo. Cela inspecte le contenu réel du fichier, pas seulement le nom de fichier.

Ainsi, votre validation de téléchargement devrait ressembler à:

if (isset($_FILES[$upload_name]) && ($_FILES[$upload_name]['error'] === UPLOAD_ERR_OK)) { 
    $fi = finfo_open(FILE_INFO_MIME_TYPE); 
    $mime = finfo_file($fi, $_FILES[$upload_name]['tmp_name']); 
    if (!in_array($valid_mime_type, $mime)) { 
     HandleError("Invalid file type $mime"); 
    } 
    etc... 
} else { 
    HandleError($uploadErrors[$_FILES[$upload_name]['error']]); 
} 
+0

Je l'ai fait mais di ne télécharge pas cette partie du code car elle n'était pas nécessaire pour le problème .----- // Validez qu'il s'agit d'une image $ imageinfo = getimagesize ($ _FICHES [$ upload_name] ['tmp_name']); if ($ imageinfo ['mime']! = 'Image/gif' && $ imageinfo ['mime']!= 'image/jpeg' && $ imageinfo ['mime']! = 'image/png' && isset ($ imageinfo)) HandleError ('Désolé, nous n'acceptons que les images GIF et JPEG'); –

Questions connexes