Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/06/2011, 12:03
Avatar de Z3R0N3
Z3R0N3
 
Fecha de Ingreso: junio-2010
Ubicación: En algún lugar de la mancha de cuyo nombre no quiero acordarme...
Mensajes: 73
Antigüedad: 13 años, 10 meses
Puntos: 4
Descarga de Archivos con JS y PHP

Muy buenas señores, me gustaría en primer lugar agradecerles el compromiso de revisarme el siguien problema y pedirles algo de colaboración con unos scripts que estoy programando en JS y PHP además de Ajax.


Dispongo de un sitio programado en Wordpress donde estoy modificando un Plugin para que me permita eliminar y descargar archivos y el problema es el siguiente:


Debido a que Wordpress genera las cabezeras ( header() ) antes de cargar los plugins, cuando intento hacer un simple;

Código:
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=mensaje_$message_id.zip");

Obviamente no hace nada, incluso llamando a la función (@ob_start(); @ob_clean(); @ob_close(); entre otras como flush();)


Por lo que había pensado en modificar las cabezeras HTTP desde Javascript.


Para ello, he usado la función HttpRequest() de javascript la cual funciona perfectamente para Eliminar archivos, pero no para Descargarlos (algo estaré haciendo mal...)


Y bueno, aquí os pego el code del JS con las variables que le llegan para que le echeis un vistazo y después el del PHP:


Variables que llegan al JS através de un enlace con la función onClick():

Código:
onclick="return confirmar('http://www.miwordpress.es/Documentos/ARCHIVOS/folder.png', '0', 1);

Código del JS:


Código:
var conexion;
function confirmar(Eliminar, datos, tipo)
{
	if(confirm('¿Desea el archivo seleccionado antes de proceder a eliminarlos?'))
		{
			conexion=HttpRequest();
			conexion.onreadystatechange = function()
				{
					if(!conexion.readyState == 4)
						{
							return eliminar(Eliminar, datos, tipo);
						} else {
							document.getElementById("proceso").innerHTML = 'Preparando Archivo para su Descarga';
						}
				};
			conexion.open('POST','?'+location.search.substring(1), true);
			conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			conexion.setRequestHeader("Content-Type","application/octet-stream");
			conexion.setRequestHeader("Content-Disposition","attachment; filename=mensaje_message_id.zip");
			conexion.send("&zip="+Eliminar);
		} else {
			conexion='';
			return eliminar(Eliminar, datos, tipo);
		}
}

function eliminar(Eliminar, datos, tipo)
{
	if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.'))
		{
			conexion=HttpRequest();
			conexion.onreadystatechange = function()
				{
					if(conexion.readyState == 4)
						{
							/* document.getElementById("vproceso").innerHTML = 'Eliminando ' + tipo == '1' ? 'Archivo' : 'Video'; */
							if (tipo == '1') { $('div#eliminar'+datos).remove(); document.getElementById("proceso").innerHTML = 'Archivo eliminado'; }
							else if (tipo == '2') { $('div#veliminar'+datos).remove(); document.getElementById("vproceso").innerHTML = 'Video y Temporales de Video eliminados'; }
						} else {
							if (tipo == '1') { document.getElementById("proceso").innerHTML = 'Eliminando Archivo'; }
							else if (tipo == '2') { document.getElementById("vproceso").innerHTML = 'Eliminando Video y Temporales de Video'; }
						}
				};
			conexion.open('POST','?'+location.search.substring(1), true);
			conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			conexion.send("&dato="+Eliminar);
		} else {
			conexion='';
		}
}

function HttpRequest()
{
	var xmlHttp=null;
	if (window.ActiveXObject)
	{
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		if (window.XMLHttpRequest)
		{
			xmlHttp = new XMLHttpRequest();
		}
	}
	return xmlHttp;
}


Y bueno, el PHP es sencillo ya que utilizo la libreria ZipFile que pueden encontrar aquí: http://www.devco.net/code/zipfile.inc.txt


El código PHP quedaría algo así:


Código:
$libreriaZIP = 'C:\Inetpub\vhosts\miwordpress.es\httpdocs\files\zipfile.php';

if (file_exists($libreriaZIP)){
require_once ($libreriaZIP);
} else{
echo 'ATENCION :: Se puede eliminar archivos pero no descargarlos.';
}

	if (isset($_POST['zip']))
		{
			$urlVirtual = '';
			$desglosando = '';
			$zipfile = '';
			$urlVirtual = $_POST['zip'];
			$desglosando = pathinfo($urlVirtual);
		
			$zipfile = new zipfile();
			$zipfile->add_dir($desglosando['basename'].'/');
			$zipfile->add_file(implode("",file($urlVirtual)), $desglosando['basename'].'/'.$desglosando['basename']);

/* AQUI DEBERIAN IR LOS 2 " HEADER() " PARA DESCARGAR EL ARCHIVO.... PERO COMO NO FUNCIONA POR ESO MISMO LO INTENTO HACER CON JAVASCRIPT */

			echo $zipfile->file();
		}


Bueno creo que el codigo queda bastante claro. De todas formas si necesitan alguna más de información que se me haya colado o cualquier cosa voy a estar atento al tema para ver si conseguimos dar con la solución.


Gracias nuevamente y... Salu2