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.
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.
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/)
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.
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. : -)
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.
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
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.
si vous ne voulez pas changer les fichiers système. Essaie juste de faire ceci:
Ouvrir
system/libraries/Upload.php
(méthodedo_upload()
ligne 205) et faites cecivar_dump($this->file_type); exit();
Essayez de télécharger un fichier.
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
.
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
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 :)
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' ) );
} } }