Cristalab

Subir archivos con nombres personalizados con Filereference

Por: MorphX + 09.01.2008

A muchos, nos pasa que queremos subir ficheros desde nuestras aplicaciones Flex o Flash, y para ellos usamos la clase a tal efecto llamada Filereference, pero también nos interesa sobremanera el poder conocer de antemano la ruta y nombre final de nuestro fichero en el servidor, y sobre todo tratar dicho nombre para evitar duplicados.

A continuación muestro un extracto de un objeto que realicé a tal efecto, la idea que aplico es la de aprovechar el envío por POST que genera Filereference para enviar el fichero, para enviar variables propias seteadas de manera precisa, para poder usar esa información extra en el servicio remoto que tratará el fichero subido, y a la postre lo renombrará y ubicará en el lugar indicado por nosotros en esas variables propias.

La función selectFile evento select de la caja de ficheros de Filereference, fijaos que creo una variable llamada Filename para llevar el nombre que quiero tener en el fichero al servicio remoto que lo creará, genUid() es una función propia que me genera un time shot para garantizar un nombre único en mi fichero.

Código :


private var file:FileReference;
private var req:URLRequest;
private var vars: URLVariables;

//Llamada por el usuario
public function openFile():void
{
   vars.description = "DESCRIPCION que quieras pasar si para lo que sea";
   vars.Remotefolder = "/www/files";
   req.url = url;
   req.data = vars;     
   req.method = URLRequestMethod.POST;
       
   file.addEventListener(Event.SELECT, selectFile);
           
   file.browse();
}

//Interna para Filereference
private function selectFile(event:Event):void
{
   file.removeEventListener(Event.SELECT,selectFile);
   vars.Filename = genUid() + file.name;
   file.upload(req);
}


Luego en el servicio solo tienes que acceder a las variables que has creado en vars, por método POST, y listo Sonrisa en PHP sería algo como esto:

Código :


<?php
if(!empty($_FILES["Filedata"]))
   {
      if(!empty($_POST["remotefolder"]))
         $folder = utf8_decode($_POST["remotefolder"]);
      
      $uploaddir.= utf8_decode($_POST["Filename"]);

      if(move_uploaded_file($_FILES["Filedata"]["tmp_name"], $uploaddir))
      {
         chmod($uploaddir,0777);
         echo "File Uploaded :)";
      }
      else
         echo "Cannot upload this file!";
   }
?>


También podéis usar el servlet, que realicé hace unos meses y he posteado como aporte, como servicio remoto en Java para el tratamiento de vuestros ficheros subidos con nombres personalizados en Java.



Espero que os sirva Guiño

Etiquetas actionscript_3 flex

Comentarios | Enviar un comentario
estos tips son lindos miau
aporte:
Añadiendo al post de MorphX. Lo que haré es dar el trabajo de crear archivos únicos por el lado de PHP, eso quiere decir q podré subir archivos desde mi cliente FLEX con cualquier nombre y nuestro amigo PHP hará el trabajo de hacerlos únicos.

¿Cómo? Shock
existe muchas maneras, la que más me agrada es darle un valor por fechas y horas... digamoss que es poco probable (por no decir imposible) que el método pueda ser invocado exactamente a un día y hora especifica
Personalmente uso solo fecha-hora, algo así:

Código :

$id = date("Ymd_His");

Pero si queremos ser más exquisitos, podemos utilizar milisegundos

Entonces, podemos tener nuestro php así:

Código :

$id = date("Ymd_His");
$directorio= 'miDirectorio/'.$id."_";
$uploadFile = $directorio. $HTTP_POST_FILES['Filedata']['name'];
move_uploaded_file($HTTP_POST_FILES['Filedata']['tmp_name'], $uploadFile);

echo $id."_".$HTTP_POST_FILES['Filedata']['name'];

Incluso ahi le agrego el nombre que me envía Flex, si quiero lo agrego para tenerlo de referencia, aunque personalmente no lo hago
U_U existen "usuarios" q les gusta tener archivos con espacio y caracteres especiales U_U

Explico un poco el php que tengo (es un file básico con solo lo que necesito para este ejemplo)
1. Creo una variable id que contendrá la fecha y hora
2. Agrego el directorio, el valor del id más un "_"
3. Concateno o anido el directorio + id+ "_"+ el nombre del archivo
4. Cargo el file
5. hago un echo de lo que cargué al server

Hasta ahi todo se entiende, ustedes se preguntan, y cómo relacionó el nuevo nombre del file con mi aplicación Flex?
Para eso esta el echo que hice en el php

Lo que hago es tener nuevos eventos en mi FileReference

Código :

file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, captura_ECHO);

Que nos permité capturar los valores devueltos por el php, en un método llamado captura_ECHO

Código :

private function captura_ECHO(event:DataEvent):void {
   trace(event.data);
}


Entonces yo después puedo ya relaciono por ejemplo, un texto que grabaré en la DB con la ruta de mi file.

Ojalá ayude a dar más ideas del uso del FileReference miau
Por: eldervaz
me voy
Por: Alien_blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.