Foros del Web » Programando para Internet » PHP »

Almacenar ruta de archivo (servidor) en BD para su deskrga

Estas en el tema de Almacenar ruta de archivo (servidor) en BD para su deskrga en el foro de PHP en Foros del Web. En una página deseo mostrar todos los archivos q c encuentran en el servidor. Para esto estoy utilizando una BD donde quiero q esten almacenadas ...
  #1 (permalink)  
Antiguo 08/05/2005, 17:26
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Almacenar ruta de archivo (servidor) en BD para su deskrga

En una página deseo mostrar todos los archivos q c encuentran en el servidor. Para esto estoy utilizando una BD donde quiero q esten almacenadas las rutas de los archivos, para despúes mostrarlas en la página como LINKS y así deskrgarlos directamente del servidor. Pero......

¿Cómo saber cual es la ruta de un archivo al ser subida al servidor para su deskrga?

Esta ruta yo la almacenaría al realizar el insert en la BD. Mi código es éste:

if(move_uploaded_file($_FILES['userfile']['tmp_name'],"archivos/".$_FILES['userfile']['name'])){
$sql="INSERT INTO rutas (fecha,nombre,tamaño,ruta)";
$sql.="VALUES (NOW(),'$nombre_archivo','$tamano_archivo',???)";//Aquí es donde me hace falta la ruta :(
mysql_query($sql) or die(mysql_error());
}....

Salu2
  #2 (permalink)  
Antiguo 08/05/2005, 18:23
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 13 años, 11 meses
Puntos: 2
Código PHP:
<?
$url 
"<br>".$_SERVER['SCRIPT_FILENAME'];
echo 
$url;
echo 
"<br><span style:\"color:red;\">".dirname($url)."<span>";
Creas un archivo (por ej. path.php), lo guardas en la carpeta donde piensas guardar tus archivos, accedes a él (www.misitio.com/mis_archivos/path.php, esto te dará algo como /htdocs/www/misitio/public_html, ese es el path q debes ponerle a la DB agregándole el nombre del archivo, es decir
Código PHP:
$url $_SERVER['SCRIPT_FILENAME'];
$mipathcompleto dirname($url)."/".$_FILES['userfile']['name']; 
saludos cuidate
PD: gracias cluster
__________________
Dios dira que esto no es justo, pero lo sera...
  #3 (permalink)  
Antiguo 08/05/2005, 21:46
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Funciono a la perfección!!

Muchisisimas gracias septev si me sirvio, ya salio...al fin!

Salu2
  #4 (permalink)  
Antiguo 09/05/2005, 09:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sólo un comentario ...

Yo no guardaría en la BD la ruta absoluta del archivo con respecto a ese servidor y sistema de archivos: ¿que pasaría si nos movemos de servidor? ..Lo ideal es "añadir" esa ruta absoluta "fija" no en la BD (en el registro que guarda el nombre) sino a la hora de obtener ese registro para componer un link o rutina de descarga que requiera ese ruta .. Es lo mismo que están haciendo .. pero en lugar de "cuando lo almacenan" en la BD .. será para cuando lo "lean" de la BD.

De esta forma .. las "migraciones" de datos a otros servidores o incluso para distribuir esas aplicaciones que se intalen en cualquier servidor serán menos drásticas. También ahorramos algo de datos en la BD a no ingresar a esta (almacenar) datos "redundantes" (esa misma ruta -siempre- para cada registro+su nombre).

Un saludo,
  #5 (permalink)  
Antiguo 09/05/2005, 12:41
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Mmmmmm......

Entiendo lo q me dices pero no tengo ni idea de como hacer eso. Sorry, pero cómo hago q se genere automáticamente esa ruta al servidor?
  #6 (permalink)  
Antiguo 09/05/2005, 15:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La ruta ya la conces .. y es fija .. concretamente la tienes en:

$url = $_SERVER['SCRIPT_FILENAME'];

$mipathcompleto = dirname($url)."/";

o simplemente indicandola a mano:

$mipathcompleto = "/var/www/nose.com/archivos/";

O donde esté el directorio dentro de tu servidor con ruta absoluta completa: aunque tu entres por "FTP" a tu sitio y veas un / y de ahí colgando unos cuantos directorios (en un servicio de hosting por ejemplo) realmente tu "directorio" asignado en ese servidor hasta el raiz hay más directorios por médio .. con variables como: $url = $_SERVER['SCRIPT_FILENAME']; lo puedes ver.

A la hora de presentar tus links de descarga .. simplemente concatenas tu ruta que es fija (o vas a tener directorios por médio? .. no tiene sentido si usas Base de datos para organizarlos ..):
Código PHP:
<a href="<? echo $mipathcompleto.$row['ruta'?>">Descargar <? echo $row['nombre'] >?</a>
Y sería mejor todavía si tuvieses un script que genere la descarga . .así podrías contar las descargas .. autentificar quien puede descargar .. no mostrar la ruta física donde está el archivo .. etc .. etc ..

Puedes ver como hacer un script de estas características usando:
header() y readfile()
(usa el buscador del foro .. se comenta mucho el tema)

Un saludo,
  #7 (permalink)  
Antiguo 09/05/2005, 18:41
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Ahí voy otra vez!

Cluster!! de antemando gracias x la ayuda, soy relativamente nueva en esto y ando aprendiendo en la marcha. Pasando a lo otro....

He estado probando como me has dicho pero algo no me sale. T muestro lo q hago:

Código PHP:
<?
//subearchivo.php 
move_uploaded_file($_FILES['userfile']['tmp_name'],"htdocs/upload_php/".$_FILES['userfile']['name']))
$url $_SERVER['SCRIPT_FILENAME'];
$ruta dirname($url)."/".$_FILES['userfile']['name'];
$sql="INSERT INTO rutas (fecha,nombre,tamaño,ruta)";
$sql.="VALUES (NOW(),'$nombre_archivo','$tamano_archivo','$ruta')";?>....
<a href="archivos.php">Ver archivos</a>
Código PHP:
//archivos.php
require('conexion.php');
function mostrarTemplate($tema, $variables)
{
        extract($variables);
        eval("?>".$tema."<?");
}
$sql = "
SELECT FROM rutas";
$rs = mysql_query($sql);
if(mysql_num_rows($rs)>0){
         $template = implode("", file('pagdescarga.html'));
         while($row = mysql_fetch_assoc($rs)) {
         mostrarTemplate($template, $row);
         }
}
Código HTML:
<!--pagdescarga.html-->
.........
<td><center><?=$fecha?></center></td>
        <td><center><?=$nombre?></center></td>
        <td><center><?=$tamaño?></center></td>
        <td><center><a href="<?=$ruta?>">DESCARGAR</a></center></td> 
Mmmmmm?
  #8 (permalink)  
Antiguo 10/05/2005, 00:19
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 13 años, 11 meses
Puntos: 2
subearchivo.php
Cita:
$ruta = dirname($url)."/".$_FILES['userfile']['name'];
pagdescarga.html
Cita:
<a href="<?=$ruta?>">DESCARGAR</a>
El error q estas cometiendo es q defines $ruta en un script y luego lo utilizas en otro y nunca se lo pasas al template, por la URL sería lo más sencillo si es q el archivo q te da el path hacia el archivo esta ubicado en una carpeta distinta q el template, sino lo haces solamente en el template, además la plantilla tiene extensión .html, por lo q server es probable q no lo tome como un script de PHP y no procese los datos (en este caso imprimir $ruta). Además no deberías de poner el nombre del archivo recién subido en la $ruta porq esto te daría como rtado /www/htdocs/mi_sitio/mis_archivos/mi_archivo.txt ¿Pero no quieres mostrar y q tengan acceso a todos los archivos?, solo tendrías este enlace.
Por lo q debes agregarle el nombre del archivo y $ruta dejarla solo con dirname($url);
luego el en <a href=<?=$ruta."/".$nombre_del_archivo?>
Saludos cuidate
__________________
Dios dira que esto no es justo, pero lo sera...
  #9 (permalink)  
Antiguo 10/05/2005, 11:03
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Sonrisa Veamos....

En "archivos.php" yo hago una consulta jalando todo de mi tabla "rutas". A través de "mostrarTemplate($template,$row)" indico q me muestre en "pagdescarga.html" ($template) todos los registros ($row) recogidos. Esto se encuentra dentro de un while q se encarga de mostrarme hasta el último registro, o sea todos mis archivos.

Los datos q visualizo en "pagdescarga.html" ( <?=$fecha?>,<?=$nombre?>....) los interpreta de la consulta echa en "archivos.php" (algo innesperado, no? jeje) y pos al parecer no hay problema con la extensión.

Todo lo hace bien, lo q no se es como generar esa ruta q me menciona cluster x q como el dijo hago mucha redundancia en mis rutas además de q me cusaria problemas si cambio de server.

Salu2
  #10 (permalink)  
Antiguo 10/05/2005, 11:28
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 13 años, 11 meses
Puntos: 2
Si, después he observado tu función. Para pasarle la ruta usando $_SERVER['SCRIPT_FILENAME'] y dirname tienes q considerar esto:
En primer lugar script_filename te da el path completo hacia el script q lo contiene, por eso deberías de poner ese archivo en la carpeta donde tienes tus archivos a mostrar, por q segun tengo entendido, en la DB solo guardas el nombre del archivo... me sigues?
Ejemplo:
Código HTML:
http://www.misitio.com.ar/mis_archivos/ En esta carpeta estan tus archivos
Código PHP:
http://www.misitio.com.ar/mis_archivos/path.php
en path.php es en donde debes de poner
$url 
$_SERVER['SCRIPT_FILENAME'];
Esto te daría algo como
/www/public_html/misitio/mis_archivos/path.php
con dirname le quitamos el 
/path.php
$path 
dirname($url);
Esto te daría algo como
/www/public_html/misitio/mis_archivos 
A este path es al q debes de agregarle la barra y el nombre de archivo
Código PHP:
<a href="<?=$path.'/'.$row['nombre_de_tu_archivo']?>">
Ahora como incluyes esto en tu template, pues podrías hacer include asi path.php y modificar tu función para agregarle otro parámetro, $path.
Saludos cuidate
__________________
Dios dira que esto no es justo, pero lo sera...
  #11 (permalink)  
Antiguo 10/05/2005, 13:12
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Ahora si!

Ya está! Eh quitado ese campo de ruta en mi B.D x q es redundante, ya se genera automaticamente la ruta al servidor y solo le agrego el nombre de mi archivo.....y listo para descargar!

Algo más...no se exactamente cuales sean las formas de mostrar lo q contiene un campo de un registro, pero en la manera como me lo sugeriste no daba, tal vez x q en mi template debe haber algo más, no se pero a mi me funciona de esta manera:

Código PHP:
<a href="<?=$servidor.'/'.$nombre?>">
y no así:

Código PHP:
<a href="<?=$servidor.'/'.$row['nombre']?>">
Seria bueno saber como se hace para q funcione como tu dices, muy posiblemente me estoy perdiendo de algo muy bueno.

Grax, grax, grax

Última edición por Ultra Violeta; 10/05/2005 a las 13:20 Razón: Me falto algo x ahi jejeje
  #12 (permalink)  
Antiguo 10/05/2005, 14:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. eso de $row['....'] lo puse por qué así solemos llamar a la variable que sale de un:

while ($row=mysql_fetch_xxxxx()){

echo $row['nombre_campo_o_columna_del_resultado'];
}

Como no veo el código completo que usas .. así me "confundí" o asumí cosas que no eran aplicables a tu caso concreto.

Ahora que ya tienes claro ese caso .. te recomendaría ver el tema que te hacía mención sobre usar un script para gestionar la descarga (que todo pase por el) .. para hacer cosas como control de descargas y sobre todo a nivel de seguridad te servirá.

Me refiero al uso de las cabeceras HTTP adecuadas para descarga (en función del tipo de archivo) por:

header()
www.php.net/header
y
readfile()
www.php.net/readfile
(aplicado a la ruta de tu archivo completa que ya sabes generar)

Un saludo,
  #13 (permalink)  
Antiguo 11/05/2005, 12:32
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Sonrisa Ok....

Esto ya está un poco mareado pero si cheks como 3 ó 4 mensajes arriba te daras cuenta de q así le estoy haciendo:

Código PHP:
//archivos.php
$sql "SELECT * FROM rutas";
$rs mysql_query($sql);
...................
 while(
$row mysql_fetch_assoc($rs)) {
 
mostrarTemplate($template$row); 
Y para mostrarlos solo nesecito hacer esto...
Código PHP:
//pagdescarga.html
<?=$fecha?>
Un poco raro??.
Bueno y volviendo con tu recomendación de header() y readfile() ya estoy comenzando a leer...grax

Salu2
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 18:00.