Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Que significa este codigo?

Código PHP:
    $file="/home/web/archivo.txt";
    
$filename "archivo.txt";

    
Header "Content-Type: application/octet-stream");
    
Header "Content-Length: ".filesize($filename));
    
Header"Content-Disposition: attachment; filename=$");
    
readfile($filename); 
El codigo que les muestro arriba lo encontre en la web buscando como ocultar la url de un archivo al iniciar una descarga.

Lo que me piden es hacer una web que permita realizar algunas descargas unicamente si el usuario ha introducido una clave que se le envia por correo, pero al llegar a este punto me encuentro con que cualquier usuario puede ver de donde pueden descargar el archivo desde el cuadro que aparece en cualquiera de los exploradores al iniciar una descarga.

La verdad no entiendo para nada este codigo, lo que dice la explicacion de ello es:

Cita:
puedes llamar el archivo algo asi como archivo.php?id=1
El nombre lo guardas en la base de datos y lo sacas a partir del id.

El usuario solo vera que baja desde archivo.php?id=1 y el nombre que aparecera en el brower es "archivo.txt"

O sea, no hay forma de saber donde esta el archivo original....
Pero aun asi, no se como funciona.

Saludos y gracias por sus respuestas.
Responder Con Cita
  #2  
Antiguo 08-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Para mi que estaría más correcto así:

Código PHP:
$file="/home/web/archivo.txt";
$filename "otro_nombre_de_archivo.txt";

Header "Content-Type: application/octet-stream");
Header "Content-Length: ".filesize($file));
Header"Content-Disposition: attachment; filename=$filename");
readfile($file); 
$file es el archivo real, cuya ubicación puede estar incluso fuera del árbol de directorio web, esto es, fuera de htdocs, de manera que no es directamete alcanzable desde fuera.

$filename es el nombre que deseas que le aparezca al usuario, puede ser cualqiera que se te ocurra.

Los header le indican al navegador del usuario que lo que el servidor manda tiene por nombre $filename y le indica el tamaño de forma que el navegador pueda poner la barra de progreso de descarga.

readfile simplemente lee el archivo (el real) y lo escupe hacia el navegador.

El primer header entonces, indica alnavegador (creo) que es una archivo a descargar y no algo que presentar en la ventana.

El script donde colocarías este código tendría primero que revisar si se ha introducido la clave.

El usuario únicamente verá que se está descargando un archivo de nombre 'otro_nombre_de_archivo.txt' pero no podrá saber que el archivo original en realidad se llama 'archivo.txt' y- más importante -no sabrá su ubicación real.

// Saludos
Responder Con Cita
  #3  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Hoye Roman, mejor explicado, ni con tutor privado.

Muchas gracias.
Saludos desde Guatemala.
Responder Con Cita
  #4  
Antiguo 08-01-2006
Avatar de Zeta
Zeta Zeta is offline
Miembro
 
Registrado: feb 2005
Posts: 215
Poder: 20
Zeta Va por buen camino
Lightbulb

Seguro que se puede ocultar el lugar de la descarga?

con el administrador de descargas de Mozilla se puede ver desde donde se descarga aunque tenga el "archivo.php?id=1" haciendo click derecho y propiedades en el archivo.

Y me parece que con otros también, con el DAP por ejemplo.

Creo que hay que encararlo desde el punto de vista de los permisos y tiempos de acceso al lugar donde se descarga (creo )


Saludos
__________________
And I'd like an hour on the holodeck with Seven of Nine.
Responder Con Cita
  #5  
Antiguo 08-01-2006
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
En todos los navegadores si le das a un link a un archivo de texto, por defecto te lo mostrará sin presentarte opción a descargarlo, asi que debes tu seleccionarlo y copiarlo o un guardar como.

Enviando los headers al navegador, se puede hacer que el navegador no "interprete" y que haga lo que le dice el host. En este caso una web, asi seria la única forma de poder presentarle al que esta mirando la web un fichero para descargar, que simplente es un TXT.

Pero bue... el readfile esta de más en esas lineas, si lo que estas buscando es hacer un anti-leech (que el usuario final no vea de donde descarga)...

Si esta bien hecho no lo ve ni Dios... ni con mozilla ni nada.

Este me ha sido útil durante mucho tiempo, y aun nadie ha logrado pasarlo.

Código PHP:
<?php
require("../config_sitio.php");
$rs1=mysql_query("SELECT * FROM ".$tlogs." where ip='".GetHostByName($REMOTE_ADDR)."'");
$fil=mysql_num_rows($rs1);
if (
$fil>0)
{
 
$ADMIN[defaulturl] = "[url="http://www.tuweb.com"]http://www.tuweb.com[/url]";
 
$ADMIN[url_1] = "[url="http://www..com/files"]http://www.tuweb.com/files[/url]";
 
$desde $HTTP_REFERER;
 
$pos strpos($desde,"com");
 if (
$pos === false)
 {
  
header("Location: $ADMIN[defaulturl]");
 }else{
  
$doweb=substr($desde0$pos+3); 
 }
 if (
$doweb != "[url="http://www..com"]http://www.tuweb.com[/url]")
 
{
  
header("Location: $ADMIN[defaulturl]");
 }else{
  
$theu "url"."_"."$site";
  require(
"../config_sitio.php");
  
$rs1=mysql_query("SELECT * FROM ".$tdown." where id=".$file);
  
$fil=mysql_num_rows($rs1);
  if (
$fil>0)
  {
   
$rs1 mysql_query("UPDATE ".$tdown." set descargas=descargas+1 where id=".$file);
  }else{
   
$rs1 mysql_query("INSERT INTO ".$tdown." (id, descargas) VALUES(".$file.",1)");
  }
  
$db null;
  
$rs1 null;
  
$fil null;
  
header("Location: $ADMIN[$theu]/$file.zip");
 }
}else{
 
$db null;
 
$rs1 null;
 
$fil null;
 echo 
"<script>";
 echo 
"window.location.href='$desde';";
 echo 
"alert('Necesitas tener un usuario del foro y estar conectado.');";
 echo 
"</script>";
}
?>
Bue, este código lo hice un dia, para alguien que queria que la gente que se descargue sus archivos, fueran miembros de un foro.

Ya me diras si te sirve !

Saludetes.
__________________
El diseño dira si tiene futuro...

Última edición por dec fecha: 08-01-2006 a las 15:00:29.
Responder Con Cita
  #6  
Antiguo 08-01-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola

Como bien dice Xianto este código lo único que hace es obligar al navegador a abrir la ventana de descarga.

Si lo que quieres es que no puedan localizar tus archivos puedes hacerlo de dos formas muy fáciles:

Primera opción:
1. Identificar al usuario.
2. Cargar en memoria el archivo, con fopen y fread por ejemplo.
3. Mandar las cabeceras ya citadas.
4. Enviar el contenido del archivo que tenemos cargado en memoria
Código PHP:
echo $datos
De esta forma es imposible que sepan donde esta el archivo, el problema es que si son archivos muy grandes vas a saturar la memoria del servidor.

Segunda opción:
1. Identificar al usuario.
2. Copiar el archivo que se va a descargar en una carpeta temporal. Te aconsejo que utilices la funcion tmpfile() para generar un archivo con nombre único para no sobre escribir el que este descargando otro usuario.
3. Mandas las cabeceras.
4. Envias el archivo desde el directorio temporal.
5. Borras el archivo del directorio temporal, con lo que ya no es accesible para nadie.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #7  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Muchas gracias Xianto por tu ayuda, tendre que revisarlo con un poco de tiempo, porque no son muy bueno en esto, cualquier duda que tenga con respecto a tu codigo te la pongo luego.

Saludos y mil gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:41:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi