Foros del Web » Programando para Internet » Javascript »

Descarga de Archivos con JS y PHP

Estas en el tema de Descarga de Archivos con JS y PHP en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 24/06/2011, 12:03
Avatar de 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: 14 años, 5 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
  #2 (permalink)  
Antiguo 24/06/2011, 12:47
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Descarga de Archivos con JS y PHP

JS no tiene acceso al IO, por lo tanto no puede modificar, leer, abrir ni borrar archivos, lo que estás haciendo es una petición via AJAX y desde el servidor se borra el archivo en el servidor, recuerda que JS se ejecuta en el cliente.

lo que necesitas es consultar la documentación de wordpres para añadir headers desde su infraestructura, ha de tener algo similar porque en otros CMS y FW los tiene.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 26/06/2011, 13:21
Avatar de 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: 14 años, 5 meses
Puntos: 4
Respuesta: Descarga de Archivos con JS y PHP

Cita:
Iniciado por maycolalvarez Ver Mensaje
JS no tiene acceso al IO, por lo tanto no puede modificar, leer, abrir ni borrar archivos, lo que estás haciendo es una petición via AJAX y desde el servidor se borra el archivo en el servidor, recuerda que JS se ejecuta en el cliente.

lo que necesitas es consultar la documentación de wordpres para añadir headers desde su infraestructura, ha de tener algo similar porque en otros CMS y FW los tiene.


Cierto maycolvarez y gracias por tu respuesta :D


Efectivamente estoy de acuerdo en que JS funciona a nivel del cliente y no del servidor. Sabiendo que el manejo de archivos únicamente es válido para archivos que se alojan en el servidor, por ello mismo el tema de "manejarlos" como tal lo trato con PHP puro y duro (Visualizar, modificar, eliminar, zipear etc.). Mientras que JS y AJAX lo utilizo simplemente para enviar parámetros al código PHP en el momento en que el cliente lo pida. (como también para modificar las cabeceras o header();) por ejemplo;

En el código que pegué, la función que tiene es que al pulsar " X " botón invoque a la función AJAX y JS que ya están funcionando de parte del cliente, para que en ese preciso momento en el que él mismo elija, devuelva unos valores que además de no salirse de la página actual, son recibidos por el código PHP ( if (isset($_POST['acciondevueltaporJSyAJAX'])) ) que actúa de parte del servidor, permitiendo así que PHP trabaje cómodamente realizando las acciones correspondientes en el momento en que el usuario lo desee al interactuar con dicho archivo.



En cuanto a lo que dices de añadir Header() desde la infraestructura de wordpress estaría bien si usted lo tiene, un enlace para ir viendo por donde tocar y así hacer las pruebas correspondientes, de veras se lo agradecería.



En realidad toda la funcionabilidad de visualización, modificación, borrado de archivos y demás funciona perfecto de la manera en la que lo estoy haciendo, el problema como bien digo es la dichosa carga de los " header() " para indicar en ese preciso momento que se va a descargar un archivo.


Por ello pensé, ya que desde el lado de cliente puedo, en probar a modificar la cabecera del documento sin tener que recargar la página y demás, es decir, con AJAX y JS. Así invocando en ese preciso momento la acción de descarga del archivo del servidor que está zippeando PHP al invocarle desde AJAX y JS. Es decir, modificar la cabecera o Header desde AJAX y JS.


Nose si parece muy complicado... espero que lo digan si es así.


Bueno espero que puedan echarme una manita a modificar esas cabeceras desde AJAX y JS ya que como bien estoy haciendo, envío parámetros por POST con cabecera en la función "eliminar" que si bien funciona del codigo JS y AJAX. Pero da problemas la función "confirmar" que es precisamente la que interactua con el código PHP para zipear el archivo seleccionado en ese momento.



Lo dicho, nuevamente gracias por sus respuestas y... ya dispuestos estoy atento a nuevas vías para conseguir lo que busco, espero que no descuadre mucho lo ya planteado por el resto de funcionabilidad pero bueno, de perdidos al río en verdad necesito esa manita codeadora jajajaj
  #4 (permalink)  
Antiguo 29/06/2011, 12:14
Avatar de 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: 14 años, 5 meses
Puntos: 4
Respuesta: Descarga de Archivos con JS y PHP

Bueno al parecer ya empiezo a conseguir resultados dependiendo de lo que haga, en un principio lo que he hecho ha sido generar un nuevo archivo PHP llamado "generadorZIP.php" y a él quiero enviarle los parámetros para que genere el .ZIP sin tener que aparezca una ventana nueva o salga de la actual.

Ahora, si dentro del code JS que os puse, reemplazo esto:

Código:
document.getElementById("proceso").innerHTML = 'Preparando Archivo para su Descarga';
por esto:

Código:
document.getElementById("proceso").innerHTML = 'Preparando Archivo para su Descarga';
window.location.href = "http://www.miwordpress.es/archivos/generadorZIP.php";

Y elimino las lineas de más abajo de tipo:


Código:
conexion.open();
conexion.setRequestHeader();
conexion.send();
Parece que aparece el dialogo de descarga. Aunque nose proqué razón las URL's que tienen algún espacio o tilde me lanza errores, por ejemplo: "http://www.miwordpress.es/Documentos/ARCHIVOS/Archivo CON ESPACIOS.png"


Obviamente "Archivo CON ESPACIOS" no lo genera el ZIP nose pro qué razón, creo que he de hacer algo tipo "URLEncode" o así para que los reciba bien.


¿Alguien sabe como evitar ese error?



Bueno continuo... si en lugar de estos tags....:


Código:
conexion.open();
conexion.setRequestHeader();
conexion.send();

pongo estos:

Código:
			conexion.open("POST","http://www.miwordpress.es/files/generadorZIP.php", true);
			conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			conexion.send("zip="+Eliminar);

No hace nada, parece ser que no lo envía bien, lo curioso es que si repito el proceso con la tool "HTTP Live Header" de Mozilla Firefox si funciona... (aunque me redirige al archivo "generadorZIP.php" ¿Saben por qué puede ser? No lo entiendo...



Bueno haber si alguien sabe qué puede pasar... Gracias y Salu2

Etiquetas: descarga, js, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:23.