gentoo linux, java, software libre y otras hierbas
Jul, 18 2010 - 12:54 am

Comprimir archivos con PHP

Zlib es una librería que proporciona funciones que nos permiten realizar tareas de compresión y descompresión usando el formato GZIP. En esta entrada vamos a ver algunos ejemplos sencillos de compresión de archivos usando dicha librería, y además veremos cómo funcionan las librerías adicionales para comprimir archivos en ZIP y Bunzip… aunque también existen otros formatos disponibles como rar, lzf y phar.

Comprimir y descomprimir usando el formato GZIP

Este es un ejemplo básico en donde se comprime y descomprime un archivo:

function descomprimir($origen, $destino) {
  $string = implode("", gzfile($origen));
  $fp = fopen($destino, "w");
  fwrite($fp, $string, strlen($string));
  fclose($fp);
} 

function comprimir($origen, $destino) {
  $fp = fopen($origen, "r");
  $data = fread ($fp, filesize($origen));
  fclose($fp);
  $zp = gzopen($destino, "w9");
  gzwrite($zp, $data);
  gzclose($zp);
}
comprimir("archivo.txt","archivo.gz");
descomprimir("archivo.gz","archivo2.txt");

Esta es una breve descripción de las funciones para Gzip incluidas en Zlib:

  • gzclose — Cierra un puntero gz-file
  • gzcompress — Comprime una cadena de texto
  • gzencode — Crea una cadena de texto comprimida en gzip
  • gzeof — Verifica si es el fin del archivo en un puntero gz-file
  • gzfile — Lee el contenido de un archivo gzip y lo almacena en un arreglo
  • gzgetc — Obtiene el caracter al que apunta un gz-file pointer
  • gzgets — Obtiene la linea a la que apunta un gz-file pointer
  • gzgetss — Obtiene la linea a la que apunta un gz-file pointer y remueve las etiquetas HTML
  • gzinflate — Descomprime una cadena comprimida
  • gzopen — Abre un archivo gzip

Comprimir usando el formato Bunzip

Aquí un ejemplo muy básico:

function comprimir_bzip($origen, $destino){
    // abrir el archivo en modo escritura
    $bz = bzopen($destino, "w");
    // escribir el contenido del origen
    bzwrite($bz, file_get_contents($filename));
    // cerrar el archivo
    bzclose($bz);
}

Información adicional y lista de las funciones disponibles: PHP: Bunzip.

Comprimir usando el formato ZIP

En este caso se utilizan la clase ZipArchive:

function comprimir_zip($origen, $destino){
    $zip = new ZipArchive();
    if ($zip->open($destino, ZIPARCHIVE::CREATE)!==TRUE) {
        die("Error al crear el archivo");
    }
    $zip->addFile($origen, "/".basename($origen));
    $zip->close();
}

Verificar la existencia de las librerías

Esta es una manera sencilla de verificar si PHP fue compilado con soporte para estas librerías:

if( class_exists('ZipArchive') )
    echo "ZIP: OK\n";
if( function_exists('bzwrite') )
    echo "Bunzip: OK\n";
if( function_exists('gzwrite') )
    echo "gzip: OK\n";

4 Comentarios | deja el tuyo

Jul, 11 2010 - 2:08 pm

Iniciar servicio en android después del boot

Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación se encuentre activo.

La idea es más o menos sencilla: una vez que un sistema Android ha iniciado envía una acción broadcast llamada android.intent.action.BOOT_COMPLETED. La idea es crear un BroadcastReceiver que escuche este tipo de acciones e inicie el servicio que deseemos. Así pues, el primer paso es crear una clase que extienda BroadcastReceiver:

public class Recibidor extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent servicio = new Intent();
		servicio.setAction("foo.bar.Servicio");
		context.startService(servicio);
	}
}

Lo interesante aquí es que se ejecuta el método startService enviando como parámetro un Intent cuyo action es “foo.bar.Servicio”, el cual es el servicio que deseamos ejecutar. Dicho servicio es una clase que extiende de Service, y del cual debemos sobrescribir los métodos onCreate y onStart:

public class Servicio extends Service{

	private static final String TAG = "EjemploServicioBoot";

	private Timer timer;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate(){
		super.onCreate();
		Log.d(TAG, "Servicio creado");
		timer = new Timer();
	}

	@Override
	public void onStart(final Intent intent, final int startId){
		super.onStart(intent, startId);
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				Log.i(TAG, "Se ejecuta la tarea");
			}
		}, 0, 15000);
	}
}

En este caso, el servicio realiza una tarea muy simple: imprime en el log del sistema un mensaje. Básicamente tenemos un objeto tipo Timer que ejecutará una tarea; en onCreate simplemente iniciamos el objeto Timer, mientras que en onStart usamos el método scheduleAtFixedRate indicando que ejecutaremos dicha tarea cada 15 segundos.

Por último, debemos registrar en el archivo AndroidManifest.xml el BroadcastReceiver y el servicio:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="foo.bar" android:versionCode="1" android:versionName="1.0">
    <application>
        <service android:name=".Servicio">
        	<intent-filter>
        		<action android:name="foo.bar.Servicio"/>
        	</intent-filter>
        </service>
        <receiver android:name=".Recibidor">
        	<intent-filter>
        		<action android:name="android.intent.action.BOOT_COMPLETED"/>
        	</intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>

En el manifest podemos ver que añadimos un elemento service dentro de application, para registrar nuestro servicio. Y lo más interesante se ve en las líneas 12 y 17, que es donde indicamos el tipo de mensaje que nuestro recibidor estará esperando antes de ejecutar la tarea e indicamos que la aplicación requiere permisos para conocer cuando el boot del sistema a finalizado.

Descargar código fuente

Sin comentarios | deja el tuyo

Jul, 03 2010 - 12:43 am

Ganador del sorteo de los 4 e-books de Android

Hace un par de semanas publiqué una entrada en donde proponía sortear 4 e-books de Android y hoy es el día en que se escogía un ganador! El video lo grabé hace unas horas en la oficina, donde no podía hacer mucho ruido así que es un video mudo (apenas se escuchan algunos murmullos y el sonido del inicio de un Windows 7 :mrgreen: ). En fin… aquí está el sorteo y felicidades al ganador:

15 Comentarios | deja el tuyo

« Entradas anteriores