2011-03-06 21 views
8

Im tratando de hacer una carga de archivo en CodeIgniter, sin embargo, cuando agregue enctype = "multipart form-data" no pasarán los datos de la publicación. En absoluto, ni siquiera en los otros campos. Sin embargo, cuando no lo agrego, puedo obtener los otros datos de la publicación, pero por supuesto no subir archivos. ¿Qué está mal aquí? Aquí es mi punto de vista y el controlador:CodeIgniter De datos de publicación que no pasan por

Vista: solamente

<h2>Add a New Album</h2> 
<form enctype="multipart/form-data" method="post" action="<?php echo base_url();?>index.php/photo/newAlbum"> 

          <table style="margin-left:5px;"> 
           <tr> 
            <td>  Album Name:</td> 
            <td><input type="text" name="name" /></td> 
           </tr> 
           <tr> 
            <td>  Photo .zip File:</td> 
            <td><input type="file" name="userfile" size="20" /></td> 
           </tr> 
           <tr> 
            <td></td> 
            <td><input type="submit" value="Upload Photo File" /></td> 
           </tr> 
          </table> 

</form> 

controlador contiene:

var_dump($_POST); 

El resultado es:

array(0) { } 
+1

controlador es la foto, el método es NuevoÁlbum - Asumo que es var_dump en el método - lo que está en el índice y el constructor? – bensiu

Respuesta

1

interesante. El código que publicaste debería funcionar. Hice un script de prueba rápido usando su formulario, y tanto los datos $ _FILES como $ _POST vienen bien.

me encontré con esta pregunta anterior sobre SO: PHP--parsing multipart form data

Suena como el mismo problema que tienes. Lamentablemente, no se llegó a ninguna respuesta real para ese problema. Creo que esto podría ser un problema de configuración del servidor: ¿puedes probar el mismo código en otro servidor y ver si funciona?

El otro único bit de información puedo encontrar fue en la respuesta a esta pregunta, $_POST data returns empty when headers are > POST_MAX_SIZE

Si usted está tratando de cargar un archivo demasiado grande, al parecer, que puede causar PHP para tirar a la basura los datos $ _POST como bien. Pero si ha intentado enviar su formulario sin cargar un archivo (pero sigue usando "multipart/form-data"), y todavía no ve ningún dato de $ _POST, eso no se aplica.

+0

CodeIgniter une '$ _POST',' $ _GET', etc ... como una medida de seguridad y ofrece una forma administrada de acceder a ellos a través de '$ this-> input-> get (" Foo ");' Parece que el administrado el acceso no se rellena para formularios de varias partes – Basic

+1

De manera predeterminada, no destruye la matriz $ _GET global y no parece que alguna vez desactive el global $ _POST. Se puede hacer que destruya la matriz $ _GET con '$ config ['allow_get_array'] = FALSE' pero la matriz $ _POST parece permanecer intacta. Las funciones de ayuda de entrada solo simplifican la recuperación de estas matrices devolviendo false si el índice no existe. De lo contrario, siempre que $ _POST ['foo'] esté configurado como '$ this-> input-> post ('foo')' y '$ _POST ['foo']' son equivalentes. [Entrada de la Guía del usuario de CodeIgnitor] (http://codeigniter.com/user_guide/libraries/input.html) – ToothlessRebel

2

En realidad, los datos de varias partes, como la imagen/zip o algún otro tipo de datos se incluirán en la matriz $ _FILES, no $ _POST array.
Le recomiendo que use la biblioteca de carga.

vista: upload_form.php

<html> 
<head> 
<title>Upload Form</title> 
</head> 
<body> 

<?php echo $error;?> 

<?php echo form_open_multipart('upload/do_upload');?> 

<input type="file" name="userfile" size="20" /> 

<br /><br /> 

<input type="submit" value="upload" /> 

</form> 

</body> 
</html> 

vista: upload_success.php

<html> 
<head> 
<title>Upload Form</title> 
</head> 
<body> 

<h3>Your file was successfully uploaded!</h3> 

<ul> 
<?php foreach($upload_data as $item => $value):?> 
<li><?php echo $item;?>: <?php echo $value;?></li> 
<?php endforeach; ?> 
</ul> 

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p> 

</body> 
</html> 

controlador: upload.php

<?php 

class Upload extends CI_Controller { 

function __construct() 
{ 
    parent::__construct(); 
    $this->load->helper(array('form', 'url')); 
} 

function index() 
{ 
    $this->load->view('upload_form', array('error' => ' ')); 
} 

function do_upload() 
{ 
    $config['upload_path'] = './uploads/'; 
    $config['allowed_types'] = 'gif|jpg|png'; 
    $config['max_size'] = '100'; 
    $config['max_width'] = '1024'; 
    $config['max_height'] = '768'; 

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

    if (! $this->upload->do_upload()) 
    { 
    $error = array('error' => $this->upload->display_errors()); 

    $this->load->view('upload_form', $error); 
    } 
    else 
    { 
    $data = array('upload_data' => $this->upload->data()); 

    $this->load->view('upload_success', $data); 
    } 
} 
} 
?> 

Y eso es todo

1

Verifique la posible redirección incorrecta en la capa de CI. Podría ser causado por una solicitud URL incorrecta (por ejemplo, una barra '/' falta al final de la URL). Las redirecciones eliminan cualquier dato POST (estaba tratando con esto).

Por lo tanto, asegúrese de estar utilizando URL completas en la acción de formulario.

Compruebe su .htaccess y $config['uri_protocol'] consistencia también.

2

Necesita reparar su do_upload, como este ..

$this->upload->do_upload('name-of-input-file-element-of-your-form') 

Por ejemplo, en el código de la vista, que tienen:

<input type="file" name="userfile" size="20" /> 

lo tanto, su línea de do_upload, debería ser así:

$this->upload->do_upload('userfile') 

Saludos!

1

Acabo de tener el mismo problema. Lo resolví de esta manera. en application/config/config.php estableces el base_url ten en cuenta que esta URL debe ser exactamente la misma que la que llamas a tu aplicación web. Para mí, llamé a mi dominio con www.sdfsd.com, pero en el archivo de configuración escribí http://sdfsd.com y el POST del formulario no funcionó. ¡Así que cambié este y ahora todo está funcionando!

aplausos

+0

Tenga en cuenta que su URL base debe coincidir con el atributo 'action' de los formularios si está utilizando la URL completa. Por ejemplo, si 'base_url = http: // www.misitio.com' y utiliza'

' recibirá una matriz $ _POST vacía. – ToothlessRebel

0

Tuve este problema también. No estoy de acuerdo con las respuestas anteriores. Creo que lo crucial es en qué etapa de tu controlador intentas obtener los datos de la publicación. Tal vez podría publicar la parte relevante de su controlador. He encontrado que tanto los datos de envío y los datos de carga están disponibles, únicamente después de llamar

this->upload->do_upload() 

Obviamente, se utiliza una sentencia if para comprobar si hay éxito. Si tiene éxito,

$this->upload->data() 

devuelve la matriz estándar con información sobre el archivo cargado y

$this->input->post('name_of_your_form_element') 

está poblada con la información introducida en el elemento de formulario correspondiente.

3

Puede agregar este atributo formulario:
enctype="multipart/form-data;charset=utf-8"
En lugar de:
enctype="multipart/form-data"
Esto se puede ver link.

+0

Gracias @Mustafa, esto resolvió un problema que he tenido durante días. –

Cuestiones relacionadas