Drag & Drop de ficheros en Firefox

Esto puede dar mucho juego, pero tan solo funciona en Firefox 3.6+, por lo que no podemos depender de este script en nuestras aplicaciones. A partir de la versión 3.6, Firefox permite realizar drag&drop de ficheros en nuestra web y mediante Javascript poder obtener los ficheros o textos que se arrastren contra un elemento específico.

Su uso es muy sencillo:

dropzone.addEventListener("drop", function(event) {
  event.preventDefault();
  // Ready to do something with the dropped object
  var allTheFiles = event.dataTransfer.files;
  alert("You've just dropped " + allTheFiles.length + " files");
}, true);

Y dispone de una API tanto para el drag&drop como para los ficheros.

Recomiendo ver el código fuente de este ejemplo para tener una librería que te hace todo el trabajo.

file drag and drop in Firefox 3.6

Monitorizar la subida de ficheros en PHP

Algo que echo en falta de PHP es la posibilidad de saber en qué porcentaje se ha subido un fichero (por ejemplo para mostrar una barra de progreso), algo que si permiten otros lenguajes de programación.
Para poder realizarlo en PHP es necesario tener instalado APC, que mediante el parámetro APC_UPLOAD_PROGRESS permite monitorizar el progreso del upload.
El tutorial explica muy detalladamente cómo realizar un file uploader en PHP, explicando los siguientes aspectos: instalación de APC, cómo monitoriza APC, clases de PHP básicas, implementación del uploader y ampliación de las clases para mostrar el progreso.
Monitoring File Uploads using Ajax and PHP

BytesFall: explorador de archivos mediante PHP

BytesFall Explorer es un administrador de archivos vía web realizado en PHP y Javascript, que nos permite subir archivos, descargarlos, verlos, editarlos, copiarlos, mover o renombrarlos, comprimirlos y cambiar los permisos de un fichero, directorio o un grupo de ficheros y directorios.
bytesfall.png
Además es posible crear ficheros y directorios, y ejecutar comandos shell, todo ello basado en una interfaz parecida a la del explorador de Windows. Los usuarios son guardados en una BD (MySQL o PostgreSQL) para realizar la autenticación.
BytesFall Explorer

|

Escribir en ficheros mediante XUL

Leyendo la entrada de aNieto2K sobre logs en Javascript, me he acordado de que hace tiempo que quiero comentar cómo escribir en ficheros mediante XUL en extensiones para Firefox.

Aunque la principal función puede ser la escritura de opciones o ficheros de configuración o guardar datos, el motivo por el que yo lo busqué era para hacerme unos logs que me faciliten el trabajo del desarrollo de una extensión para Firefox (de aquí la asociación con el post de aNieto2K).

var savefile = "c:\\displaynotes.log.txt";
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("Permission to save file was denied.");
}
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( savefile );
if ( file.exists() == false ) {
alert( "Creating file... " );
file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 );
}
var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance( Components.interfaces.nsIFileOutputStream );
// Suponemos que existe una variable con el texto llamada content
outputStream.init( file, 0x04 | 0x10, 420, 0 );
var result = outputStream.write( content, content.length );
outputStream.close();

En el init del outputStream nos encontramos con una serie de flags para abrir el fichero que se usan como máscara. Estos flags tienen los siguientes posibles valores:

RDONLY         0x01
PR_WRONLY      0x02
PR_RDWR        0x04
PR_CREATE_FILE 0x08
PR_APPEND      0x10
PR_TRUNCATE    0x20
PR_SYNC        0x40
PR_EXCL        0x80

A parte, existe un parámetro para indicar el modo del fichero, válido únicamente para entornos Unix:

00400   Read by owner.
00200   Write by owner.
00100   Execute (search if a directory) by owner.
00040   Read by group.
00020   Write by group.
00010   Execute by group.
00004   Read by others.
00002   Write by others
00001   Execute by others.

No recuerdo de dónde saqué esta información, por lo que no os puedo poner la referencia.