Subir un excel (Upload: xls) y luego leerlo

834 views
Skip to first unread message

Rober_Toto

unread,
Mar 7, 2011, 4:19:36 PM3/7/11
to symfony-es
Hola!

Bueno, eso, tengo hasta el momento:

subir.php:
===============

<?php echo jq_form_remote_tag(array(
'update' => 'notifaciones_upload_empleador',
'url' => 'media/
upload_file'),array('name'=>'upload_form', 'id' => 'upload_form',
'enctype' => 'multipart/form-data')
)?>

<input type="file" id="file" name="file"/><br/>
<input type="submit" value="Upload!"/>

</form>


y el action, upload_file:
===============

foreach ($request->getFiles('file') as $uploadedFile){
$uploadDir = sfConfig::get('/home/mi_usuario');
move_uploaded_file($uploadedFile["file"],
$uploadDir . "/" . $uploadedFile["file"] );
}

Bueno para leerlo estoy estudiando PHP Excel Reader...

alguna ayuda? Dónde queda el archivo? Alguna otra opción? Me dan una
mano con el código?

Carlos Zuniga

unread,
Mar 7, 2011, 4:44:02 PM3/7/11
to symfo...@googlegroups.com
2011/3/7 Rober_Toto <tot...@gmail.com>:

El archivo queda a donde lo mandes con move_uploaded_file, al parecer
tienes una configuración con el parámetro '/home/mi_usuario', pero
cual es el valor?
Ten cuidado si suben dos archivos con el mismo nombre el segundo
archivo va a sobreescribir al primero. Mejor renombralos con un id o
algo.

En la documentación hay un ejemplo mucho mejor que valida a través del
formulario y utiliza sfValidatedFile para mover el archivo en lugar de
hacerlo a mano con move_uploaded_file:

http://www.symfony-project.org/forms/1_4/en/02-Form-Validation#chapter_02_file_upload


Saludos
--
Linux Registered User # 386081
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.

Roberto Rivera

unread,
Mar 7, 2011, 4:59:02 PM3/7/11
to symfo...@googlegroups.com, Carlos Zuniga
En realidad que un segundo archivo sobreescriba el inicial es el comportamiento que busco, aunque quizás por seguridad lo de las ID's que comentas puede ser útil, pero no sé cómo hacerlo.

En el caso de la dirección del archivo, la verdad no me funciona, puse eso para probar, pero inicialmente el ejemplo donde lo vi decía:


public function executeUpload(sfWebRequest $request)
{
  foreach ($request->getFiles() as $uploadedFile)
  {
    $uploadDir = sfConfig::get('sf_upload_dir');
    move_uploaded_file($uploadedFile["tmp_name"],
        $uploadDir . "/" . $uploadedFile["name"] );
  }
}


Y la verdad, no lo entiendo, eso de 'sf_upload_dir' no se a qué se refiere, tampoco tmp_name ni name y si se supone que tengo un form con estos campos:


<input type="file" id="file" name="file"/><br/>
<input type="submit" value="Upload!"/>


Si pueden explicarme cómo funciona me sería de gran utilidad, pues es lo primero que necesito para subir el archivo excel.
Saludos Cordiales.
                           _______________________________     
                                    Roberto Rivera Mardones
                                       Ingeniero Informático
                                         (09) - 7 80 88 138
                                                Santiago

                           ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯



--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.


Carlos Zuniga

unread,
Mar 7, 2011, 5:29:36 PM3/7/11
to symfo...@googlegroups.com
2011/3/7 Roberto Rivera <tot...@gmail.com>:

> En realidad que un segundo archivo sobreescriba el inicial es el
> comportamiento que busco, aunque quizás por seguridad lo de las ID's que
> comentas puede ser útil, pero no sé cómo hacerlo.
> En el caso de la dirección del archivo, la verdad no me funciona, puse eso
> para probar, pero inicialmente el ejemplo donde lo vi decía:
>
> public function executeUpload(sfWebRequest $request)
> {
> foreach ($request->getFiles() as $uploadedFile)
> {
> $uploadDir = sfConfig::get('sf_upload_dir');
> move_uploaded_file($uploadedFile["tmp_name"],
> $uploadDir . "/" . $uploadedFile["name"] );
> }
> }
>
> Y la verdad, no lo entiendo, eso de 'sf_upload_dir' no se a qué se refiere,

Es algun valor que debe estar setteado con sfConfig en alguna parte de
tu configuración. sf_upload_dir debería apuntar a un directorio donde
guardar los archivos que subes, y este directorio debería tener
permisos de escritura para el usuario que corre el servidor web, ahora
si quieres puedes dejar de usar esa variable y harcodear el directorio
pero no es recomendable.

> tampoco tmp_name ni name y si se supone que tengo un form con estos campos:

tmp_name es la ruta temporal del archivo que se acaba de subir, name
es el nombre con el que subio

Basicamente lo que debes hacer es mover el archivo de tmp_name a donde
quieras ponerlo

>
> <input type="file" id="file" name="file"/><br/>
> <input type="submit" value="Upload!"/>
>
> Si pueden explicarme cómo funciona me sería de gran utilidad, pues es lo
> primero que necesito para subir el archivo excel.
> Saludos Cordiales.

Puedes ver más información en la doc de php, por cierto
$request->getFiles() te devuelve la variable global $_FILES

http://www.php.net/manual/es/features.file-upload.post-method.php
http://www.php.net/manual/es/function.move-uploaded-file.php

Saludos

> ...

Roberto Rivera

unread,
Mar 8, 2011, 9:14:37 AM3/8/11
to symfo...@googlegroups.com, Carlos Zuniga
Finalmente seguí estas instrucciones y me resultó Perfecto: http://www.symfony-project.org/forms/1_4/en/02-Form-Validation#chapter_02_file_upload

Voy a poner paso a paso cómo lo hice para que le pueda servir a otro que tenga el mismo problema que yo.

Paso 1. Crear el archivo "ContactForm.class.php" en el siguiente directorio:

Nombre_de_Tu_Proyecto/src/trunk/lib/form/ContactForm.class.php

Paso 2. Copiar y pegar esto dentro del archivo:

<?php
class ContactForm extends BaseForm
{
  public function configure()
  {
    $this->setWidgets(array(
      'file'    => new sfWidgetFormInputFile(),
    ));
    $this->widgetSchema->setNameFormat('contact[%s]');
 
    $this->setValidators(array(
      'file'    => new sfValidatorFile(),
    ));
  }
}

Paso 3. Crear un template "upload_fileSuccess.php" con el siguiente código (llamé al action "upload_file"):
<form action="<?php echo url_for('nombre_de_tu_modulo/upload_file') ?>" method="POST" enctype="multipart/form-data">-->
  <table>
    <?php echo $form ?>
    <tr>
      <td colspan="2">
        <input type="submit" />
      </td>
    </tr>
  </table>
</form>

Paso 4: Copiar y pegar esto en el action.class.php (OJO: este método carga el formulario con el botón examinar, y este mismo lo procesa):

    public function executeUpload_file(sfWebRequest $request){
      
      $this->form = new ContactForm();

      if ($request->isMethod('post')){
        $this->form->bind($request->getParameter('contact'), $request->getFiles('contact'));

        if ($this->form->isValid()){
          $values = $this->form->getValues();
          // do something with the values
          // ...
          $file = $this->form->getValue('file');
          $filename = 'uploaded_'.sha1($file->getOriginalName());
          $extension = $file->getExtension($file->getOriginalExtension());
          $file->save(sfConfig::get('sf_upload_dir').'/'.$filename.$extension);
          // ...
        }
      }
    }

El archvio queda en el directorio: Nombre_de_Tu_Proyecto/src/trunk/web/uploads/tu_archivo.xls (en caso de mi excel).

Carlos: me pudes dar algunas pistas de las ID's para la seguridad y que no se sebreescriba el archivo?

Saludos!!!!
                           _______________________________     
                                    Roberto Rivera Mardones
                                       Ingeniero Informático
                                         (09) - 7 80 88 138
                                                Santiago

                           ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯


Carlos Zuniga

unread,
Mar 8, 2011, 3:23:36 PM3/8/11
to symfo...@googlegroups.com
2011/3/8 Roberto Rivera <tot...@gmail.com>:

En ese mismo documento muestran una manera, en la siguiente linea:

>           $filename = 'uploaded_'.sha1($file->getOriginalName());

El nombre con el que guardan el documento no es el nombre con el que
lo subieron sino 'uploaded_' más un hash sha1 del nombre original, lo
que podrías hacer para que no se sobreescriba si subes otro con el
mismo nombre (y que generaría el mismo hash) es meterle un numero
aleatorio o la fecha actual para que cada vez te de un hash distinto:

$filename = 'uploaded_'.sha1($file->getOriginalName() . time());

O sino, si además guardas la información de cada archivo que suben a
la aplicación (en este caso diría que es recomendable por que así
podrías guardar el nombre original en la base de datos), podrías
utilizar el id del registro creado en el nombre del archivo.

$filename = 'uploaded_'.sha1($file->getOriginalName()) . '_' . $id;

Saludos

Danilo

unread,
Apr 30, 2011, 6:57:57 PM4/30/11
to symfony-es
Sólo una aclaración:

Estoy casi seguro que el formulario tal y como lo usabas inicialmente
(con el helper jq_form_remote_tag()) no permite el envio de archivos.
En realidas lo que no es posible es subir archivos por ajax y
jq_form_remote_tag() envía el formulario mediante ajax. Pienso que tal
vez eso tuviera que ver con tu problema incial.

Saludos.
Danilo.

On 8 mar, 17:23, Carlos Zuniga <carlos....@gmail.com> wrote:
> 2011/3/8 Roberto Rivera <toto...@gmail.com>:
>
>
>
> > Finalmente seguí estas instrucciones y me resultó
> > Perfecto: http://www.symfony-project.org/forms/1_4/en/02-Form-Validation#chapte...
Reply all
Reply to author
Forward
0 new messages