Ver Mensaje Individual
  #9 (permalink)  
Antiguo 10/03/2007, 23:46
Avatar de ebe
ebe
 
Fecha de Ingreso: marzo-2004
Ubicación: Guatemala
Mensajes: 363
Antigüedad: 20 años, 2 meses
Puntos: 11
Re: Ocultar imágenes y pdf a los usuarios

Bueno.. el tema habla de dos formas de almacener en el DOCUMENT ROOT y luego referenciarlos para su uso en nuestras paginas web, estos son:

1. Colocar archivos PDF. .DOC para despues ser descargados por el usuario (esto es para que el unico metodo de acceso a nuestros archivos sea a traves de nuestra aplicacion al igual que en el punto dos)

2. Guardas archivos (en nuestro caso imagenes) fuera del DOCUMENT ROOT para despues utilizarlos en nuestras paginas web (para referenciarlos con la etiqueta <img>).

Como te podras imaginar, si tus imagenes estan fuera del "ROOT" como le llamas, estas no seran mostradas poniendoles el enlace (por ejemplos, que mi root este en C:/www/ y yo tengo guardas mis imagenes en C:/imagenes/) <img src="C:/imagenes/miimagen.jpg" /> ya que (como te das cuenta) no estas en el directoria de publicacion de tus paginas web, para poder publicarlas hay que mantenerlas fuera del root y traerlas al root cuando necesitemos que se muestren.

El codigo basico que he podido armar es como el siguiente (ya tu si lo modificas a tu modo), la idea seria algo asi:

1. para darle a descargar nuestros archivos al usuario( suponiendo un pdf, ya tu puedes cambiarle el MIME type dependiendo del archivo a descargar):


En este ejemplo una variable get me sirve para saber (y formar) el nombre del archivo que esta fuera del root (tu podrias haber hecho tu solicitud a la base de datos para formar este nombre tambien, si guardas el nombre del archivo en tu BBDD):

Código PHP:
<?php
session_start
();
require_once(
$_SERVER['DOCUMENT_ROOT']."/funciones/check-user.php");
chequea_usuario_valido();
//---------------------------------------------------------------------------
$pdf_i=$_GET['el_pdf'];
$pdf_i=trim($pdf_i);

// si no hay id, redirecionamos a otro archivo
if(empty($pdf_i))
{
header("location:http://midominio.com/descargas/down_2004_.php");
exit();
}


$pun=".pdf"// extension del archivo a usar

$pdf_if=$pdf_i.$pun// el id que vienes por get nos sirve para llamar a nuestro archivo fuera del root - en este caso mi archivo tiene el
//mismo nombre que el ID que viene por GET , yo solo le agrego la extension.

$nombre="edicion_$pdf_if"// creo un nombre para el archivo cuando sea descargado  - con este nombre guardara el archivo el cliente

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha en el pasado

header("Cache-Control: no-store, no-cache, must-revalidate"); // cabecera para evitar que se cachee el contenido

header("Cache-Control: post-check=0, pre-check=0"false);

header("Pragma: no-cache");

// cabecera para decirle al navegor del tipo de contenido a ejectuar
header('Content-type: application/pdf');

//aqui le decimos que al navegador lo forzaremos a descargar el archivo pdf
header("Content-Disposition: attachment; filename=$nombre");

// AQUI ES CUANDO LLAMAMOS A NUESTRO ARCHIVO FUERA DEL ROOT PARA QUE SE MUESTRE
readfile($_SERVER['DOCUMENT_ROOT']."/../pdfs/".$pdf_if);

// .............. aqui podrias redirecionar

?>

ahora si lo que necesitas es trabajar con imagenes (las cuales quiere tener fuera del root) y solo llamaras cuando un usuario autorizado la solicite (y que no se puedan acceder directamente desde la barra de direcciones del navegador:

uploadarchivo.php

Código PHP:
<?php

// cabeceras para que no se cachee tu contenido

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha en el pasado
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");

if(isset(
$_POST['subir'])){

// CHECK THAT ID IS CORRECT
    
if( trim($_FILES['file']['name']) == ''){
    
header("location:uploadarchivo.php?err=1");
    exit;
    }
    
    if(
$_FILES['archivo']['type'] != 'image/jpeg' && substr($_FILES['file']['name'], strlen($_FILES['file']['name']) - 4) != '.jpg' ){
    
header("location:uploadarchivo.php?nojpg=1");
    exit;
    }
    
    
/* AQUI PODRIAS EXPLORAR EL TAMANO DEL ARCHIVO *- TAMBIEN DEBERIAS PONER MAX_FILE_SIZE EN EL FORM.. PARA VALIDAR DOBLEMENTE.
    // if file size is greater than the allowed of 2000000kb, redirect -
    if($_FILES['file']['size'] > 2000000){
    header("location:uploadarchivo.php?err=1");
    exit;
    }
    */

    // RUTA FUERA DE NUESTRO DOCUMENT ROOT
    
$archivo $_SERVER['DOCUMENT_ROOT'].'/../secureinfo/'.$_FILES['file']['name'];
    
// $archivotmp = $_FILES['file']['tmp_name'];
    // echo($archivo1);
    // exit;
    
    // check if file is copy without problem to itss new location.
    
if(!move_uploaded_file($_FILES['file']['tmp_name'], $archivo)){
         echo(
'Problem moving file to new location, try again in a few minutes.');
         exit;
     }
     
     
     
/*******************************
     * COMO TE DAS CUENTA ARRIBA.. AQUI YA HEMOS GUARDADO EL ARCHIVO FUERA DEL ROOT
     * AHORA DESPUES DE HABERLO MOBIDO, DEBERIAS GUARDAR EL NOMBREE DEL ARVCHIVO EN TU BASE DE DATOS
     * PARA CUANDO NECESITES REFERENCIARLO NUEVAMENTE DENTRO DEL ROOT.
     *
     * -*--------------------------
     *
     * AHORA EN LA PARTE DE ABAJO ESTA UN SIMPLE PROCESO DE COMO LO PODRIAS MOSTRAR NUEVAMENTE CUANDO 
     * LO NECESITES (SUPONIENDO QUE $_FILES['file']['name']  ES EL NOMBRE DE LA IMAGEN PREVIAMENTE ALMACENADO EN TU BBDD
     * AL FINAL LA MUESTRO EN MI PAGINA MOVIENDOLA FUERA DEL ROOT AL ROOT (EN LA CARPETA PROTECTED)
     * AL FINAL BORRANDOLA.. COMO TE DIGO.. LA IDEA IRIA POR AQUI.. YA TU COMO LA CAMBIES A TU NECESIDAD.
     **********************************/
     
     
     
    // echo '';
    // exit;
    
$destino '/protected/';

                
// get the file back from document root level below
                
if(!copy($_SERVER['DOCUMENT_ROOT'].'/../secureinfo/'.$_FILES['file']['name'], $_SERVER['DOCUMENT_ROOT'].'/protected/'.$_FILES['file']['name'])){
echo(
'no se puede copiar el archivo');

}
                
                
                echo(
'<img src="/protected/'.$_FILES['file']['name'].'" />');
                
                
                
// PONGO UN SLEEP SOLO PARA COMPROBAR COMO COPIO LA IMAGEN FUERA DEL ROOT AL ROOT (PROTECTED)
                // DESPUES LA BORRO
                // ESTE PROCESO DE BORRADO LO DEJO PARA QUE TU VEAS EN QUE MOMENTO Y COMO LO IMPLEMENTEAS.
                
                
                
sleep(20);
                
                
                
// AQUI ES CUANDO BORRO LA IMAGEN,, YA QUE NO QUIERO QUE QUEDE DENTRO DEL ROOT
                // CONTENIDO SOLO ACCESIBLE POR APLICACION.
                
                // if(unlink($_SERVER['DOCUMENT_ROOT'].'/protected/'.$_FILES['file']['name']))
                // echo(' archivo borrado normalmente porque ya no lo usaremos Y NO QUEREMOS QUE QUEDE EN EL ROOT.');
                
                // }
                
                




}else{
?>
<html>
<head>
<title>PRUEBA</title>
<body>
<?php
//echo("<img src='$ruta[0]$ruta[1]/secureinfo/butterfly.gif"."' />");
?>
<form action="uploadarchivo.php" method="post" enctype="multipart/form-data" name="form1">
  <p><label for="archivo">Archivo</label>
    <input type="file" name="file" id="file" />
</p>
  <p>
    
    <input type="submit" name="subir" value="subir" id="subir" />
</p>
</form>
</body>
</html>

<?php
}
?>

por aqui iria la idea.. es un codigo rapidamente plasmado paero la idea esta ahi.. como poner pdf a descarga o poner imagenes fuera de tu document root y mostrarlas en tus paginas cuando las necesites (y ya tu decides si borrarla al final y en que momento hacerlo)

un saludo.

http://php.net/header
http://php.net/copy
http://dns.bdat.net/trucos/faqphp-v1/x801.html
__________________
http://dev.wsnetcorp.com

Última edición por ebe; 11/03/2007 a las 04:24 Razón: deleted none $_FILE checking / add image mime type