web-dev-qa-db-fra.com

Uploading in Codeigniter - Le type de fichier que vous essayez de télécharger n'est pas autorisé

Je reçois le message d'erreur suivant: le type de fichier que vous essayez de télécharger n'est pas autorisé lorsque je tente de télécharger un fichier.

if(!empty($_FILES['proof_of_purchase']['name'])) {
    $config['upload_path'] = './uploads/invoices/';
    $config['allowed_types'] = 'gif|jpg|jpeg|png|pdf|bmp';
    $config['max_size'] = '3000';
    $this->load->library('upload', $config);

      // if there was an error, return and display it
    if (!$this->upload->do_upload('proof_of_purchase'))
    {
        $data['error'] = $this->upload->display_errors();
        $data['include'] = 'pages/classic-register';
    } else {
        $data['upload_data'] = $this->upload->data();
        $filename = $data['upload_data']['file_name'];
    }
}

J'ai essayé de nombreux fichiers différents, principalement des fichiers gif et jpeg, et j'ai la même erreur à chaque fois. 

var_dump ($ _ FILES); Donne moi:

array(1) { ["proof_of_purchase"]=> array(5) { ["name"]=> string(28) "2010-12-04_00019.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(19) "D:\temp\php2BAE.tmp" ["error"]=> int(0) ["size"]=> int(58054) } } 

J'ai vérifié la configuration de MIME et elle contient les bonnes choses. Exemple:

'jpeg'  =>  array('image/jpeg', 'image/pjpeg'),
'jpg'   =>  array('image/jpeg', 'image/pjpeg'),
'jpe'   =>  array('image/jpeg', 'image/pjpeg'),

J'ai passé beaucoup trop de temps là-dessus et ça me rend fou! Toutes les idées seraient extrêmement utiles.

16
dangermark

Si vous utilisez Codeigniter version 2.1.0, la bibliothèque de téléchargement contient un bogue. Voir http://codeigniter.com/forums/viewthread/204725/ pour plus de détails.

En gros, j'ai modifié quelques lignes de code dans la classe de téléchargement de fichier (Emplacement: ./system/libraries/Upload.php).

1) modifier le numéro de ligne 1044 

de:

$this->file_type = @mime_content_type($file['tmp_name']);
return;

pour ça:

$this->file_type = @mime_content_type($file['tmp_name']);
if (strlen($this->file_type) > 0) return; 

2) modifier le numéro de ligne 1058

de:

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_path']), $output, $return_code);

pour ça:

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_name']), $output, $return_code); 

Comme vous pouvez probablement le constater, la ligne 1058 tente d’utiliser une valeur de tableau qui n’existe pas.

25
Adam

J'ai eu les mêmes problèmes avec CI et je n'ai pas trouvé de solution sur les forums ou via Google. Ce que j'ai fait est d'autoriser tous les types de fichiers, afin que le fichier soit téléchargé. Ensuite, je gère la logique manuellement pour déterminer s'il convient d'autoriser/de conserver le fichier ou de le supprimer et d'indiquer à l'utilisateur que le type de fichier n'est pas autorisé.

$config['upload_path'] = './uploads/invoices/';
$config['allowed_types'] = '*'; // add the asterisk instead of extensions
$config['max_size'] = '3000';
$this->load->library('upload', $config);

if (!$this->upload->do_upload('proof_of_purchase'))
{
    $data['error'] = $this->upload->display_errors();
    $data['include'] = 'pages/classic-register';
} else {
    $data['upload_data'] = $this->upload->data();
    // use custom function to determine if filetype is allowed
    if (allow_file_type($data['upload_data']['file_ext'])) 
    {
        $filename = $data['upload_data']['file_name'];
    }
    else
    {
        show_error('File type is not allowed!');
    }
}

EDIT - Cela suppose que vous utilisez le CI 2 (dans le CI 1, vous pouvez suivre le tutoriel ici pour autoriser tous les types de fichiers: http://net.tutsplus.com/tutorials/php/6- codeigniter-hacks-for-the-masters/ )

5
swatkins

Ce que j'ai fait est de créer ma propre bibliothèque "MY_Upload" pour étendre la classe CI_Upload, puis je viens de copier la classe CI_Upload et d'appliquer les modifications décrites par Adam (merci beaucoup pour la solution) dans ma bibliothèque personnalisée.

Cela me permet d'utiliser la syntaxe standard de CI et d'éviter de pirater les fichiers d'origine! Ma bibliothèque est automatiquement utilisée car elle "étend" simplement l'original, c'est une solution totalement indolore et qui ne casse pas si, pour une raison quelconque, vous devez remplacer les fichiers d'origine.

PS: Je le fais avec la classe de journalisation également lorsque je souhaite générer des journaux personnalisés.

3
Petar Zivkovic

J'ai eu le même problème. Vous devrez peut-être vérifier si l'application reconnaît le type MIME du fichier en cours de téléchargement. L'ajout d'un nouveau type MIME à config/mimes.php a résolu le problème. :-)

1
abhisek

Ceci est pour Codeigniter version 2.2. Si cette question est toujours d'actualité. J'ai retracé l'erreur dans le fichier système/libraries/upload.php jusqu'à la fonction: protected function _file_mime_type($file) à la ligne 1032 et à la ligne 1046: $this->file_type = $matches[1]; Lorsque je téléchargeais un fichier avec l'extension .txt, l'instruction à la ligne 1046 semblait attribuer une valeur incorrecte de 'text/x-asm' à $this->file_type qui est comparé plus tard à 'text/plain' et comme les types mime ne correspondent pas, le test échoue et signale un type de fichier inapproprié et un message d'erreur: 

"Le type de fichier que vous essayez de télécharger n'est pas autorisé"

La solution, pas sûre, mais la solution rapide qui semble fonctionner, changez la condition de la ligne 1032 en NOT afin qu'elle se lise: if (!function_exists('finfo_file')) au lieu de: if (function_exists('finfo_file')). J'espère que cela peut aider quelqu'un.

1
Jason

La solution est de remplacer le fichier Upload.php dans le répertoire system/libraries/by Upload.php de CodeIgniter v2.0.3.

0
iwebprog

1) Autoriser tous les types de fichiers . 2) Définir manuellement la règle de validation avec le php traditionnel pour accepter ou rejeter les types de fichiers . 3) si les règles de validation sont respectées, puis télécharger à l'aide de l'assistant de téléchargement CI.

if (isset($_FILES['upload_file']) && !empty($_FILES['upload_file'] ['name'])) {
        $file_name=$_FILES['upload_file'] ['name'];
        $acceptedext=array("Zip","pdf","png","jpg","jpeg");
        $a=(explode('.', $file_name));
        $b=end($a);
        $file_ext=strtolower($b);

        if (!in_array($file_ext, $acceptedext)) {
            $this->session->set_flashdata( 'flash_message_error', "file format not accepted!" );
            redirect( base_url( 'page' ) );
        }
        else{
            $config['upload_path'] = './uploads/';
            $config['allowed_types'] = '*';


            $this->load->library('upload');
            $this->upload->initialize($config);

            if (!$this->upload->do_upload('upload_file')) {

                $error = $this->upload->display_errors('', ' ');
                $this->session->set_flashdata( 'flash_message_error', $error );
                redirect( base_url( 'page' ) );
            } } }
0
Focus Classic

Ce problème est dû à l'absence de l'extension FileInfo PHP. La fonction utilisée par la classe de téléchargement fait partie de cette extension. 

http://www.php.net/manual/en/ref.fileinfo.php

0
Andrew

Il vaut probablement la peine de vérifier que vous avez la dernière version de application/config/mimes.php car au lieu de définir une variable $ mimes, elle retourne simplement un tableau.

nouveau mimes.php

retour tableau 

old mimes.php

$ mimes = tableau

Si vous avez toujours l'ancienne version de mimes.php, la fonction Common.php & get_mimes () retourne un tableau vide . Cela a pour effet de casser Upload.php.

Une fois que j'ai tracé cela, tout fonctionnait bien :)

0
markBradford

Le même problème que j'avais avec, lorsque j'essayais de créer un formulaire de téléchargement à télécharger, les fichiers ". Xlsx", qui, dans le fichier mimes.php de CodeIgniter, contenait une entrée représentant les extensions de fichier "xlsx".

Donc, ici, dans le lien link , j’ai décrit ce qui est vraiment nécessaire pour résoudre ce problème et trouver la solution!

Meilleures salutations,

Randika

0
Randika Vishman

Si vous ne souhaitez pas modifier les fichiers système. Essayez ceci:

  1. Ouvrez system/libraries/Upload.php (méthode do_upload() ligne 205) et procédez comme suit.

    var_dump($this->file_type);
    exit();
    
  2. Essayez de télécharger un fichier.

  3. Ajoutez le type de fichier que vous voyez dans var_dump() à application/config/mimes.php.

Petit exemple: vous avez un problème avec .docx. Essayez d'ajouter:

'docx' => array('application/Zip', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')

Pour application/config/mimes.php.

0
joni jones