php - libreria - Cargando en Codeigniter: el tipo de archivo que está intentando cargar no está permitido
libreria upload codeigniter (11)
Me aparece el error: el tipo de archivo que está intentando cargar no está permitido cuando intento subir un archivo.
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''];
}
}
He probado muchos archivos diferentes, principalmente gif y jpeg, y obtengo el mismo error cada vez.
var_dump ($ _ FILES); me da:
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) } }
He comprobado la configuración de mime y contiene las cosas correctas. Ejemplo:
''jpeg'' => array(''image/jpeg'', ''image/pjpeg''),
''jpg'' => array(''image/jpeg'', ''image/pjpeg''),
''jpe'' => array(''image/jpeg'', ''image/pjpeg''),
¡He pasado demasiado tiempo en esto y me está volviendo loco! Cualquier idea sería extremadamente útil.
He tenido estos mismos problemas con CI y no he podido encontrar una solución en los foros ni a través de google. Lo que he hecho es permitir todos los tipos de archivos, para que el archivo se cargue. Luego, manejo la lógica manualmente para determinar si permitir / mantener el archivo, o eliminarlo y decirle al usuario que el tipo de archivo no está permitido.
$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!'');
}
}
EDITAR : suponiendo que está utilizando CI2 (en CI 1 puede seguir el tutorial aquí para permitir todos los tipos de archivos: http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the- maestros / )
Si está utilizando Codeigniter versión 2.1.0, hay un error en la biblioteca de carga. Ver http://codeigniter.com/forums/viewthread/204725/ para más detalles.
Básicamente lo que hice fue modificar algunas líneas de código en la clase File Upload (Location: ./system/libraries/Upload.php)
1) modificar el número de línea 1044
de:
$this->file_type = @mime_content_type($file[''tmp_name'']);
return;
a esto:
$this->file_type = @mime_content_type($file[''tmp_name'']);
if (strlen($this->file_type) > 0) return;
2) modificar el número de línea 1058
de:
@exec(''file --brief --mime-type '' . escapeshellarg($file[''tmp_path'']), $output, $return_code);
a esto:
@exec(''file --brief --mime-type '' . escapeshellarg($file[''tmp_name'']), $output, $return_code);
Como probablemente pueda ver, la línea 1058 intenta usar un valor de matriz que no existe.
Tuve el mismo problema. Es posible que deba verificar si la aplicación reconoce el tipo mimet del archivo que se está cargando. Agregar un nuevo tipo de mimet a config / mimes.php solucionó el problema. :-)
La solución es reemplazar Upload.php en el sistema / libraries / por Upload.php de CodeIgniter v2.0.3
Lo que hice fue crear mi propia Biblioteca "MY_Upload" para extender la clase CI_Upload, luego copié la clase CI_Upload y apliqué los cambios descritos por Adam (muchas gracias por la solución) en mi biblioteca personalizada.
Esto me permite usar la sintaxis estándar de CI y evitar hackear los archivos originales. Mi biblioteca se usa automáticamente porque simplemente "amplía" el original, es una solución completamente sencilla y no se romperá si por alguna razón tiene que reemplazar los archivos originales.
PD: hago esto con la clase de registro también para cuando quiero generar registros personalizados.
Este problema es causado por no tener la extensión PHP FileInfo. La función que usa la clase de carga es parte de esa extensión.
Si no quiere cambiar los archivos del sistema. Solo prueba esto:
Abra el
system/libraries/Upload.php
(métododo_upload()
línea 205) y haga estovar_dump($this->file_type); exit();
Intenta subir un archivo.
Agregue el tipo de archivo, que ve en
var_dump()
aapplication/config/mimes.php
.
Pequeño ejemplo: tienes un problema con .docx
. Intenta agregar:
''docx'' => array(''application/zip'', ''application/msword'', ''application/vnd.openxmlformats-officedocument.wordprocessingml.document'')
Para application/config/mimes.php
.
Esto es para Codeigniter versión 2.2. Si esta pregunta aún es relevante Seguí el error en el archivo file / libraries / upload.php file para funcionar: función protected function _file_mime_type($file)
en la línea 1032 y línea 1046: $this->file_type = $matches[1];
Cuando estaba cargando un archivo con la extensión .txt, la instrucción en la línea 1046 parece asignar un valor incorrecto de ''text/x-asm''
a $this->file_type
que luego se compara con ''text/plain''
y como los tipos de mime hacen no coincide con la prueba falla y señala un tipo de archivo inapropiado y un mensaje de error:
''El tipo de archivo que está intentando cargar no está permitido''
Solución, no estoy seguro, pero solución rápida que parece funcionar, cambie la condición de la línea 1032 a NOT
para que se lea: if (!function_exists(''finfo_file''))
lugar de: if (function_exists(''finfo_file''))
. Espero que esto pueda ayudar a alguién.
Probablemente valga la pena comprobar que tiene la última versión de la aplicación / config / mimes.php, ya que en lugar de establecer una variable $ mimes, ahora simplemente devuelve una matriz.
nuevo mimes.php
matriz de retorno
viejo mimes.php
$ mimes = array
Si todavía tiene la versión anterior de mimes.php, la función Common.php & get_mimes () devuelve una matriz vacía. Esto tiene el efecto knockon de romper Upload.php
Una vez que tracé esto, todo estaba funcionando bien :)
El mismo problema que tuve, cuando estaba tratando de hacer un formulario de carga para cargar, los archivos ".xlsx", que en el archivo mimes.php de CodeIgniter tienen una entrada en su matriz, para representar las extensiones de archivo "xlsx".
Así que aquí, en el siguiente enlace , describí lo que realmente se necesita para superar este problema y descubrir la solución.
Atentamente,
Randika
1) Permitir todos los tipos de archivos. 2) Establecer manualmente la regla de validación con php tradicional para aceptar o rechazar tipos de archivos. 3) si se obedecen las reglas de validación, luego cargue usando el asistente de carga de 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'' ) );
} } }