Téléchargement dans Codeigniter - le type de fichier que vous tentez de télécharger N'est pas autorisé

j'obtiens l'erreur: Le type du fichier que vous tentez de télécharger n'est pas autorisée lorsque j'essaie d'uplaod n'importe quel 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é beaucoup de fichiers différents-surtout gif & jpeg et j'ai la même erreur à chaque fois.

var_dump($_FILES); me donne:

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:tempphp2BAE.tmp" ["error"]=> int(0) ["size"]=> int(58054) } } 

j'ai vérifié la config 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 dingue! Toutes les idées seraient extrêmement utile.

16
demandé sur dangermark 2011-09-21 10:26:59

11 réponses

si vous utilisez Codeigniter version 2.1.0, il y a un bug dans la bibliothèque de téléchargement. Voir http://codeigniter.com/forums/viewthread/204725/ pour plus de détails.

En Gros, ce que j'ai fait, c'est Modifier quelques lignes de code dans la classe de téléchargement de fichiers (emplacement: ./système/bibliothèques/Upload.php)

1) modifier la ligne 1044

:

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

à:

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

2) modifier le numéro de ligne 1058

:

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

à:

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

Comme vous pouvez probablement voir, ligne 1058 essaie d'utiliser un tableau de valeur qui n'existe pas.

25
répondu Adam 2012-02-14 08:51:04

J'ai eu ces mêmes problèmes avec CI et n'ai pas été en mesure de trouver une solution sur les forums ou via google. Ce que j'ai fait, c'est d'autoriser tous les types de fichiers, pour que le fichier soit téléchargé. Ensuite, je gère la logique manuellement pour déterminer s'il faut autoriser/conserver le fichier, ou le supprimer et dire à l'utilisateur que filetype 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 - ceci suppose que vous utilisez CI 2 (dans 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
répondu swatkins 2011-12-15 15:07:56

ce que j'ai fait, c'est créer ma propre bibliothèque "MY_Upload" pour étendre la classe CI_Upload, puis j'ai juste copié la classe CI_Upload et appliqué les changements décrits par Adam (merci à un groupe BTW pour la solution) dans ma bibliothèque personnalisée.

cela me permet d'utiliser la syntaxe standard CI, et d'éviter de hacker les fichiers originaux! Ma Bibliothèque est automatiquement utilisée parce qu'elle "étend" simplement l'original, c'est une solution totalement indolore et ne se cassera pas si pour une raison quelconque vous devez remplacer les fichiers d'origine.

PS: je fais cela avec la classe Logging aussi pour quand je veux générer des logs personnalisés.

3
répondu Petar Zivkovic 2012-05-30 11:03:58

j'ai eu le même problème. Vous aurez peut-être besoin de vérifier si l'application reconnaît le type Mimet du fichier qui est téléchargé. Ajout d'un nouveau mimetype à config/mimes.php a résolu le problème. : -)

1
répondu abhisek 2012-03-28 15:21:02

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

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

Solution, incertain, mais solution rapide qui semble fonctionner, changer l'état de la ligne 1032 à NOT ce qui donne: if (!function_exists('finfo_file')) au lieu de: if (function_exists('finfo_file')). J'espère que cela peut aider quelqu'un.

1
répondu Jason 2014-07-31 00:16:36

la solution est de remplacer le téléchargement.php dans le système/bibliothèques/ par Téléchargement.php de CodeIgniter v2.0.3

0
répondu iwebprog 2012-04-28 11:06:22

ce problème est causé par le fait de ne pas avoir L'extension PHP FileInfo. La fonction que la classe upload utilise fait partie de cette extension.

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

0
répondu Andrew 2012-08-10 19:05:39

si vous ne voulez pas changer les fichiers système. Essaie juste de faire ceci:

  1. Ouvrir system/libraries/Upload.php(méthode do_upload() ligne 205) et faites ceci

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

  3. Ajouter un 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')

application/config/mimes.php.

0
répondu joni jones 2013-08-15 15:04:27

le même problème que j'avais avec, quand j'essayais de faire un formulaire de téléchargement pour télécharger, ".XLSX " fichiers, qui dans codeigniter's mimes.le fichier php a une entrée dans son tableau, pour représenter les extensions de fichier "xlsx".

Donc ici, dans la suite lien, j'ai décrit ce qu'il faut vraiment pour surmonter ce problème et trouver la solution!

Cordialement,

Randika

0
répondu Randika Vishman 2017-05-23 12:25:53

il est probablement intéressant de vérifier que vous avez la dernière version de l'application/config/mimes.php comme au lieu de définir une variable $mimes, il renvoie simplement un tableau.

mimes.php

return array

vieux mimes.php

$ mimes = array

Si vous avez encore l'ancienne version de mimes.php le commun.fonction php &get_mimes() renvoie un tableau vide. Cela a l'effet d'entraînement de la rupture de Téléchargement.php

une Fois que j'ai tracé de cette, tout fonctionnait bien :)

0
répondu markBradford 2017-03-03 12:27:11

1) Permettre à tous les types de fichiers. 2) définir manuellement la règle de validation avec php traditionnel pour accepter ou rejeter les types de fichiers. 3) si les règles de validation sont respectées, alors upload using CI upload helper.

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
répondu Focus Classic 2017-11-08 01:42:19