Je rencontre un problème de téléchargement très étrange. Voici le fichier de vue pertinent:
<form action="http://localhost/index.php/temp/upload/" method="post" enctype="multipart/form-data">
<fieldset>
<input type="file" name="userfile"/>
<input type="submit" value="Upload"/>
</fieldset>
</form>
Et voici la méthode upload()
de mon contrôleur temp
:
public function upload()
{
$config['upload_path'] = FCPATH . 'uploads' . DIRECTORY_SEPARATOR;
assert(file_exists($config['upload_path']) === TRUE);
$config['allowed_types'] = 'avi|mpg|mpeg|wmv|jpg';
$config['max_size'] = '0';
$this->load->library('upload', $config);
if ($this->upload->do_upload('userfile') === FALSE)
{
// Some error occured
var_dump($this->upload->display_errors('', ''));
var_dump($_FILES);
}
else
{
// Upload successful
var_dump($this->upload->data());
}
}
Lorsque je télécharge une vidéo AVI, tout fonctionne bien. Lorsque je télécharge, par exemple, une vidéo WMV, je reçois les dumps var suivants:
string 'The filetype you are attempting to upload is not allowed.' (length=57)
array
'userfile' =>
array
'name' => string 'wmv.wmv' (length=7)
'type' => string 'video/x-ms-wmv' (length=14)
'tmp_name' => string 'C:\wamp\tmp\php2333.tmp' (length=23)
'error' => int 0
'size' => int 83914
L'extension "wmv" est interprétée comme le type MIME: video/x-ms-wmv
. Cela devrait aller puisque mon config/mimes.php a les caractéristiques suivantes:
'wmv' => array('video/x-ms-wmv', 'audio/x-ms-wmv')
C'est une situation similaire lorsque j'essaye de télécharger d'autres fichiers. Jusqu'à présent, le seul qui semble fonctionner est mon test vidéo AVI.
Des idées ce qui pourrait être faux?
MISE À JOUR 1:
Une de mes machines, seuls les téléchargements AVI. Sur la machine d'un autre développeur, aucun fichier n'est chargé. Sur la machine d'un autre développeur, tous les fichiers pris en charge sont téléchargés. S'agit-il de problèmes de navigateur ou de serveur?
Vous utilisez Firefox, n'est-ce pas?
Vous pouvez essayer de regarder system/libraries/Upload.php
ligne 199:
$this->_file_mime_type($_FILES[$field]);
Changez cette ligne en:
$this->_file_mime_type($_FILES[$field]); var_dump($this->file_type); die();
Ensuite, téléchargez votre fichier .wmv
. Il afficherait quelque chose comme application/octet-stream
ou autre chose. Ajoutez cela à votre mimes.php
. J'espère que cette aide =)
Réponse similaire ici
Quelques liens:
$ config ["allowed_types"] = "*";
Sur le serveur sur lequel vous avez téléchargé le fichier .wmv, exécutez le code PHP suivant.
<?php
$file_path = 'CHANGE_THIS_TO_ABSOLUTE_FILE_PATH_THAT_YOU_HAVE_UPLOADED.wmv';
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_file($finfo, $file_path);
var_dump($mime);
?>
Enregistrez le code sous le nom mime.php
Vérifiez également PHP_VERSION dans les autres machines de développement. finfo_open est introduit dans PHP 5.3. La machine de développement sur laquelle le téléchargement fonctionne a peut-être une version plus ancienne de PHP ou un type mime correct pour le fichier wmv.
avez-vous essayé d'utiliser des types mime au lieu des extensions dans $ config ['allowed_types']?
écris comme ça
$config["allowed_types"] = "video/x-msvideo|image/jpeg|video/mpeg|video/x-ms-wmv";
Vérifiez votre fichier mimes.php dans application/config. Il doit renvoyer un tableau de types mime, par exemple return $mimes;
en fin de fichier ou return array(.....
en début de tableau.
J'ai récemment eu des problèmes très similaires avec la classe de téléchargement de Codeigniter.
Les * allowed_types * ne semblent pas fonctionner. Par exemple, je souhaitais autoriser le téléchargement d’images .PNG, mais cela ne leur permettait pas de passer par son filtre. J'ai fini par enquêter davantage. J'ai autorisé le téléchargement temporaire de tous les types de fichiers, j'ai chargé un fichier .PNG, puis jeté les données de téléchargement ( $ this-> upload-> data ()); ). Pour une raison quelconque, il pensait que le type MIME était text/plain ! Cela pourrait être lié à votre problème.
J'ai trouvé des solutions à ce problème surfer sur des forums où vous pouvez modifier/étendre la classe ou le noyau, mais elles ne m'ont pas fonctionné - désolé. Je crois que c'est un bogue de Codeigniter Core (je pense que le problème a déjà été ouvert avec EllisLabs). J'ai fini par coder durement cette fichue chose quand même! Eh bien, j'espère que cela vous aide.
Exemple de base/solution de contournement,
//replace with your allowed MIME types
if ($_FILES['name_of_form_upload']['type'] != 'image/jpeg' && $_FILES['name_of_form_upload']['type'] != 'image/png' && $_FILES['name_of_form_upload']['type'] != 'image/gif') {
$data['message'] = '<div class="message">That file type is not allowed!</div>';
$this->load->view('home_view', $data);
} else {
//run upload code
}
Edit: Formatage/Grammaire
Réponse pour télécharger le fichier .doc dans CodeIgniter
Change ça
'doc' => 'application/msword',
Avec cela en ligne n ° 95 (fichier application/config/mimes.php
)
'doc' => array('application/vnd.ms-Word','application/msword'),
si vous avez besoin d’un moyen simple pour résoudre ce problème, il existe une solution simple à cela . ouvrir le fichier "system/libraries/Upload.php"
line no 465
you will see
if ( ! $this->is_allowed_filetype())
{
$this->set_error('upload_invalid_filetype', 'debug');
return FALSE;
}
just make it true
if ( ! $this->is_allowed_filetype())
{
$this->set_error('upload_invalid_filetype', 'debug');
return TRUE;
}
note : it will stop your all file type validation.
C’est en fait un bogue dans le noyau. Je suis passé à la dernière version de CI et le bogue a disparu.
Changer le fichier IN application\config\Mimes.php