Discussion:
Copiar foto de una tabla a otra
(demasiado antiguo para responder)
Paul
2007-04-02 06:27:53 UTC
Permalink
Hola,

Tengo en un campo de una tabla, campo blob, una foto, y la quiero
copiar a otro campo de otra tabla, pero no logro hacerlo. Tambien me
interesaría pasar la foto a un fichero.

Alguien puede ayudarme?

Gracias
countach
2007-04-02 09:18:31 UTC
Permalink
Post by Paul
Hola,
Tengo en un campo de una tabla, campo blob, una foto, y la quiero
copiar a otro campo de otra tabla, pero no logro hacerlo. Tambien me
interesaría pasar la foto a un fichero.
Alguien puede ayudarme?
Gracias
¿Qué sentido tendrá almacenar las fotos en una tabla, en lugar de una
referencia?

Sobre el fichero, pues abriendo el fichero, escribiendo y luego cerrando, ya
lo tendrías.


"select foto from tabla_de_fotos"

$f=fopen("archivo.jpg", "w+");
fwrite($f,resultado['foto']);
fclose($f);

Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
Paul
2007-04-02 12:02:49 UTC
Permalink
Hola,
Post by countach
Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
Esto es lo que te´nía echo, pero me da un error
Post by countach
Post by Paul
Hola,
Tengo en un campo de una tabla, campo blob, una foto, y la quiero
copiar a otro campo de otra tabla, pero no logro hacerlo. Tambien me
interesaría pasar la foto a un fichero.
Alguien puede ayudarme?
Gracias
¿Qué sentido tendrá almacenar las fotos en una tabla, en lugar de una
referencia?
Sobre el fichero, pues abriendo el fichero, escribiendo y luego cerrando, ya
lo tendrías.
"select foto from tabla_de_fotos"
$f=fopen("archivo.jpg", "w+");
fwrite($f,resultado['foto']);
fclose($f);
Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
countach
2007-04-02 15:13:21 UTC
Permalink
Hola,
Post by countach
Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
Esto es lo que teŽnía echo, pero me da un error
Bien. Un "error".

Niños, ahora hay que adivinar el error.

Pregunte de una vez de forma completa, no nos tenga lanzando migajas como si
de un acertijo se tratara.
Oscar Garcia
2007-04-02 17:27:59 UTC
Permalink
Post by Paul
Post by countach
Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
Esto es lo que te´nía echo, pero me da un error
Aramis Fuster y Rappel no participan en este grupo de noticias, lo
siento.

Hasta entonces déjame adivinar (lo mismo les quito su trabajo y todo).
Creo que no has usado addslashes.. ¿verdad? :)

$query = mysql_query ('SELECT blob FROM tabla WHERE ...');
list ($blob) = mysql_fetch_array ($query);
$query = mysql_query ('INSERT INTO tabla (blob) VALUES (\''.
addslashes ($blob) .'\')');

Prueba y nos cuentas.

Y si no te funciona, por favor.. indícanos qué te muestra mysql_error,
¿vale?
http://es.php.net/mysql_error

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Victor Lopez
2007-04-02 18:59:51 UTC
Permalink
Post by Oscar Garcia
Y si no te funciona, por favor.. indícanos qué te muestra mysql_error,
¿vale?
¿Para que?

Eso le quita emoción !!!

:-)))
--
----o---( )---o----
Saludos de Victor Lopez Sabio
***@ono.com
--------oooo--------
Paul
2007-04-05 06:25:11 UTC
Permalink
Hola,
Ante todo muchas gracias por contestar,

Ya solucioné el error, y efecteivamente era lo de "addslashes"

Gracias
Post by Oscar Garcia
Post by Paul
Post by countach
Y para copiarlo en otra, pues un insert en la otra habiendo con el
resultado["foto"]
Esto es lo que te´nía echo, pero me da un error
Aramis Fuster y Rappel no participan en este grupo de noticias, lo
siento.
Hasta entonces déjame adivinar (lo mismo les quito su trabajo y todo).
Creo que no has usado addslashes.. ¿verdad? :)
$query = mysql_query ('SELECT blob FROM tabla WHERE ...');
list ($blob) = mysql_fetch_array ($query);
$query = mysql_query ('INSERT INTO tabla (blob) VALUES (\''.
addslashes ($blob) .'\')');
Prueba y nos cuentas.
Y si no te funciona, por favor.. indícanos qué te muestra mysql_error,
¿vale?
http://es.php.net/mysql_error
Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Oscar Garcia
2007-04-05 10:43:56 UTC
Permalink
Post by Paul
Ante todo muchas gracias por contestar,
Ya solucioné el error, y efecteivamente era lo de "addslashes"
Por eso no me gusta nada el magic_quotes_gpc.. no usar addslashes
porque te las pone automáticamente PHP te crea costumbres muy feas.
Post by Paul
Gracias
De nada.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Billy
2007-04-05 14:53:14 UTC
Permalink
Yo tengo un problema parecido, tengo fotos en campos blob y quiero mostrar
las fotos por una web, hasta ahora lo he hecho con fwrite, pasandolas a
fichero y tratandolas como archivo temporal, pero ¿hay alguna otra forma de
hacerlo?, a mi me gustaría hacerlo directamente, sin que la imagen pase por
el disco duro, ¿es posible?, y si tengo que tratarlas como archivos
temporales, ¿cuando puedo borrarlas? porque no tengo claro si la imagen ha
sido tranferida o no.
Oscar Garcia
2007-04-05 18:33:56 UTC
Permalink
Post by Billy
Yo tengo un problema parecido, tengo fotos en campos blob y quiero mostrar
las fotos por una web, hasta ahora lo he hecho con fwrite, pasandolas a
fichero y tratandolas como archivo temporal, pero ¿hay alguna otra forma de
hacerlo?, a mi me gustaría hacerlo directamente, sin que la imagen pase por
el disco duro, ¿es posible?, y si tengo que tratarlas como archivos
temporales, ¿cuando puedo borrarlas? porque no tengo claro si la imagen ha
sido tranferida o no.
Simplemente pide en una consulta el campo que contiene la imagen,
envía las cabeceras necesarias para decir que se trata de una imagen..

$query = mysql_query (...);
list ($imagen) = mysql_fetch_array ($query);
header ('Content-type: image/jpeg');
header ('Content-length: '. strlen ($imagen));
echo $imagen;

.. Y listo.

Basta con incluir la imagen así:
<img src="imagen.php" alt="Imagen" />

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-09 10:14:46 UTC
Permalink
Post by Oscar Garcia
Post by Billy
Yo tengo un problema parecido, tengo fotos en campos blob y quiero mostrar
las fotos por una web, hasta ahora lo he hecho con fwrite, pasandolas a
fichero y tratandolas como archivo temporal, pero ¿hay alguna otra forma de
hacerlo?, a mi me gustaría hacerlo directamente, sin que la imagen pase por
el disco duro, ¿es posible?, y si tengo que tratarlas como archivos
temporales, ¿cuando puedo borrarlas? porque no tengo claro si la imagen ha
sido tranferida o no.
Bueno y para hacer lo contrario, subir una imagen a una campo blob desde un
formulario HTML, ¿como se hace directamente?
Post by Oscar Garcia
Simplemente pide en una consulta el campo que contiene la imagen,
envía las cabeceras necesarias para decir que se trata de una imagen..
$query = mysql_query (...);
list ($imagen) = mysql_fetch_array ($query);
header ('Content-type: image/jpeg');
header ('Content-length: '. strlen ($imagen));
echo $imagen;
.. Y listo.
<img src="imagen.php" alt="Imagen" />
Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Oscar Garcia
2007-04-09 13:56:43 UTC
Permalink
Post by Gonzalo
Bueno y para hacer lo contrario, subir una imagen a una campo blob desde un
formulario HTML, ¿como se hace directamente?
Depende... si están activadas las magic_quotes_gpc entonces es
trivial:

INSERT INTO tabla (..) VALUES ($datos)

En caso contrario tendrás que hacerle un addslashes antes de añadirlo
a la sentencia SQL.

El tema está extensamente tratado en otros muchos hilos (en los que en
algunos he indicado cómo detectar dicho parámetro de configuración
para que la aplicación sea transparente a ella).

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-09 16:17:26 UTC
Permalink
Post by Gonzalo
Post by Gonzalo
Bueno y para hacer lo contrario, subir una imagen a una campo blob desde un
formulario HTML, ¿como se hace directamente?
Depende... si están activadas las magic_quotes_gpc entonces es
INSERT INTO tabla (..) VALUES ($datos)
En caso contrario tendrás que hacerle un addslashes antes de añadirlo
a la sentencia SQL.
Pues no me sale...
a ver si puedes echarme un ojito a este código:
_________________________________________________________
<?php
include 'lib/libreria.inc';
if (!isset($_POST['nombre'])) {
echo '
<form action="registro2.php" method="post">
<table>
<td> Nombre:
<td> <input type="text" name="nombre">
<tr>
<td> Foto:
<td> <input type="file" name="foto">
</table>
<p>
<input type="submit" name="Enviar" value="Enviar">
</form>
';
} else {

$conexion = conectar ();
$sql = "INSERT INTO base.tabla (nombre,foto) VALUES
('{$_POST[nombre]}','{$_POST[foto]}')";
if ($result = mysql_query ($sql, $conexion)) {
echo 'Todo bien...';
} else {
echo 'Ha habido un error con la base de datos, reintentelo más tarde.';
}
}
?>
_________________________________________________________

el campo foto está declarado en la tabla como mediumblob.
el codigo anterior guarda bien el valor de nombre, pero la foto guarda como
81 bytes, un tamaño que nada tiene que ver con el real.
he intentado poner: $_POST[foto] = addslashes($_POST[foto]); antes
de la linea que empieza por $sql, pero sigue igual.
Gonzalo
2007-04-09 16:42:29 UTC
Permalink
vale, si antes hago la pregunta antes encuentro el problema, resulta que
estaba grabando la ruta donde se encuentra la foto en mi disco duro, por eso
salia ese tamaño tan ridículo.

en el código me faltaba:

$tmp_name = $_POST["foto"];
$fp = fopen($tmp_name, "rb");
$tfoto = fread($fp, filesize($tmp_name));
$tfoto = addslashes($tfoto);
fclose($fp);

y luego en el INSERT poner $tfoto en vez de $_POST["foto"]

ya funciona !!!.
Post by Gonzalo
Post by Gonzalo
Post by Gonzalo
Bueno y para hacer lo contrario, subir una imagen a una campo blob desde un
formulario HTML, ¿como se hace directamente?
Depende... si están activadas las magic_quotes_gpc entonces es
INSERT INTO tabla (..) VALUES ($datos)
En caso contrario tendrás que hacerle un addslashes antes de añadirlo
a la sentencia SQL.
Pues no me sale...
_________________________________________________________
<?php
include 'lib/libreria.inc';
if (!isset($_POST['nombre'])) {
echo '
<form action="registro2.php" method="post">
<table>
<td> <input type="text" name="nombre">
<tr>
<td> <input type="file" name="foto">
</table>
<p>
<input type="submit" name="Enviar" value="Enviar">
</form>
';
} else {
$conexion = conectar ();
$sql = "INSERT INTO base.tabla (nombre,foto) VALUES
('{$_POST[nombre]}','{$_POST[foto]}')";
if ($result = mysql_query ($sql, $conexion)) {
echo 'Todo bien...';
} else {
echo 'Ha habido un error con la base de datos, reintentelo más tarde.';
}
}
?>
_________________________________________________________
el campo foto está declarado en la tabla como mediumblob.
el codigo anterior guarda bien el valor de nombre, pero la foto guarda
como 81 bytes, un tamaño que nada tiene que ver con el real.
he intentado poner: $_POST[foto] = addslashes($_POST[foto]);
antes de la linea que empieza por $sql, pero sigue igual.
Oscar Garcia
2007-04-09 17:59:45 UTC
Permalink
Post by Gonzalo
Post by Gonzalo
Post by Gonzalo
Bueno y para hacer lo contrario, subir una imagen a una campo blob desde un
formulario HTML, ¿como se hace directamente?
Depende... si están activadas las magic_quotes_gpc entonces es
INSERT INTO tabla (..) VALUES ($datos)
En caso contrario tendrás que hacerle un addslashes antes de añadirlo
a la sentencia SQL.
Pues no me sale...
Veamos, te voy a ayudar a limpiar un poco el código... empecemos con
la limpieza...
Post by Gonzalo
<form action="registro2.php" method="post">
<form enctype="multipart/form-data" method="post"
action="registro2.php">

No te olvides de la codificación.
Post by Gonzalo
$sql = "INSERT INTO base.tabla (nombre,foto) VALUES
('{$_POST[nombre]}','{$_POST[foto]}')";
Tal y como has dicho en tu post anterior, estabas usando el nombre del
archivo temporal.. pero es mejor usar lo siguiente (que para eso
Post by Gonzalo
$sql = "INSERT INTO base.tabla (nombre,foto) VALUES
('{$_POST[nombre]}','{$_POST[foto]}')";
$_FILES['foto']['tmp_name'] contiene el nombre del archivo temporal.
No te fíes por variables predefinidas ya que las últimas versiones de
PHP vienen con esa función desactivada.

Para cargar el archivo te recomiendo file_get_contents o bien file:

if (function_exists (file_get_contents)) {
$datos = file_get_contents ($_FILES['foto']['tmp_name']);
} else {
$datos = file ($_FILES['foto']['tmp_name']);
$datos = implode ('', $datos);
}

Si usas file recuerda hacer un implode para unir aquellas partes que
hayan podido ser separadas por un retorno del carro.

Luego sólo resta insertarlo en la base de datos teniendo en cuenta que
$_POST['foto']['name'] contiene el nombre del archivo en el origen
(por si así te evitas el campo "nombre" que has creado):

if (!magic_quotes_gpc ()) {
$_POST['nombre'] = addslashes ($_POST['nombre']);
}
$sql = 'INSERT INTO tabla (nombre, foto) VALUES (\''.
$nombre .'\', \''. addslashes ($datos) .'\')';

Te recomiendo que no uses esa práctica mal heredada de la gente que
suele usar access.

Para páginas web es un error almacenar imágenes o archivos en la base
de datos, es recomendable guardarlo en un directorio del servidor y
acceder a él cuando necesites la imagen. De ese modo aprovecharás la
caché del navegador, proxies transparentes, etc.. acelerando
notablemente la velocidad de tu web y descargando los recursos del
servidor.

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-10 08:48:28 UTC
Permalink
Post by Oscar Garcia
Para páginas web es un error almacenar imágenes o archivos en la base
de datos, es recomendable guardarlo en un directorio del servidor y
acceder a él cuando necesites la imagen. De ese modo aprovecharás la
caché del navegador, proxies transparentes, etc.. acelerando
notablemente la velocidad de tu web y descargando los recursos del
servidor.
Interesante.
¿y que permiso tengo que darle al directorio carpeta para poder subir las
fotos sin que todo hijo de vecino suba lo que le de la gana?
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
Oscar Garcia
2007-04-10 10:30:14 UTC
Permalink
Post by Gonzalo
Post by Oscar Garcia
Para páginas web es un error almacenar imágenes o archivos en la base
de datos, es recomendable guardarlo en un directorio del servidor y
acceder a él cuando necesites la imagen. De ese modo aprovecharás la
caché del navegador, proxies transparentes, etc.. acelerando
notablemente la velocidad de tu web y descargando los recursos del
servidor.
Interesante.
¿y que permiso tengo que darle al directorio carpeta para poder subir las
fotos sin que todo hijo de vecino suba lo que le de la gana?
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
Tienes varias formas de hacerlo.

Una de ellas es guardando los archivos en un directorio fuera del raiz
del sitio web. Es decir.. si al entrar por FTP tienes que meter, por
ejemplo, los archivos en un directorio llamado html, puedes crear un
directorio fuera de él donde meter los archivos.

Otro método consistiría en usar htpasswd para ponerle clave al
contenido del directorio en caso de que intenten acceder de forma
directa.

Otro método más sería usar htaccess para impedir que puedan bajarse
nada del contenido del directorio (con un deny from all, por ejemplo).

Si no deseas que accedan de forma directa a los archivos elimina la
posibilidad de hacer que sea el servidor web quien gestione las
cabeceras de última modificación, si ha sido modificado desde una
fecha, descarga parcial, etc... a no ser que los programes en PHP.

El número máximo de inodos por directorio es variable:
http://en.wikipedia.org/wiki/Ext3#_note-0

Podrás encontrar que es un número suficientemente elevado como para
almacenar millones de entradas sin problemas (con una partición de
varios gigas).

De todas formas comentamos en otra hebra técnicas para aumentar ese
límite, como crear directorios y subdirectorios teniendo en cuenta la
raiz del nombre de archivo, por ejemplo:
/imagenes/pa/ja/pajaro.jpg
/imagenes/el/ef/elefante.jpg

Suponiendo que el límite fueran sólo 1000 entradas por directorio, con
3 niveles de directorio aumentarías el límite a 1000*1000*1000 como
máximo (al usar caracteres alfanuméricos (26+10) * (26+10) > 1000, en
caso contrario quedaría limitado por la combinación de letras y
números) y 1000 como mínimo si todos empiezan por la misma raiz (poco
probable).

Personalmente usaría como raiz la firma md5 del nombre del archivo,
así se repartiría de manera más equitativa por la estructura de
directorios.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-13 11:12:17 UTC
Permalink
Post by Oscar Garcia
Post by Gonzalo
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
http://en.wikipedia.org/wiki/Ext3#_note-0
Ya veo, que sea variable es el problema, ¿hay alguna forma de saber cuantos
archivos puede tener un directorio de mi servidor? ¿hay alguna función PHP
para averiguar esto?
Oscar Garcia
2007-04-13 14:26:27 UTC
Permalink
Post by Gonzalo
Post by Oscar Garcia
Post by Gonzalo
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
http://en.wikipedia.org/wiki/Ext3#_note-0
Ya veo, que sea variable es el problema, ¿hay alguna forma de saber cuantos
archivos puede tener un directorio de mi servidor? ¿hay alguna función PHP
para averiguar esto?
Te puedo asegurar que más de los que necesites.

En caso de necesitar más siempre puedes usar las técnicas que te comenté.

Por ejemplo... a la hora de buscar un archivo no lo hagas por su nombre
de archivo (o el identificador de usuario), hazlo por su firma md5 (por
ejemplo):

function ruta_md5 ($archivo) {
$md5 = md5 ($archivo);
return substr ($md5, 0, 3) .'/'. substr ($md5, 3, 3) .'/'.
substr ($md5, 6, 3) .'/'. substr ($md5, 9, 3) .'/'.
substr ($md5, 12, 3) .'/'. substr ($md5, 15, 3) .'/'.
substr ($md5, 18, 3) .'/'. substr ($md5, 21, 3) .'/'.
substr ($md5, 24, 3) .'/'. substr ($md5, 27, 3) .'/'.
$md5 .'-'. $archivo;
}

Cada carácter md5 es un caracter hexadecimal. Si lo agrupamos de 3 en 3
estaremos haciendo 16*16*16 = 4096 combinaciones, que es un número que
soporta perfectamente cualquier sistema de archivos (ntfs son 2^32-1 o
ext3 que serían por defecto 524.288 para un volumen de 4 gigas, aunque
se pueden modificar al número deseado al crear la partición con el
modificador -N de mkfs.ext3). Ojo.. fat12 no lo soportaría, pero fat16 y
fat32 sí (65Kficheros y 256Mficheros respectivamente).

Bien, con cada nivel de directorio de 3 letras y un total de 10 niveles
de directorio tenemos 4096^10 directorios que pueden ser creados...
luego lo multiplicaríamos por la cantidad de archivos que podemos
guardar en cada directorio (despreciable a estas alturas).

Sólo en directorios tenemos 1,33 * 10^36 vamos.. un uno seguido de 36
ceros.. si crearas 1000 directorios distintos por segundo.. tardarías
aproximadamente 42 cuatrillones de años en llegar al límite (yo creo que
antes agotarías el espacio en disco :).

¿Te parece suficientemente potente un algoritmo así? :)

Ya que no creo que llegues a esos extremos quizá vendría bien sólo un
par de niveles... la función md5 se usa para dispersar los datos entre
los directorios de manera más o menos equitativa (para no ser influida
por la distribución común de letras en cierto idioma o sistema de
numeración).

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-13 15:08:30 UTC
Permalink
Post by Oscar Garcia
Post by Gonzalo
Post by Oscar Garcia
Post by Gonzalo
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
http://en.wikipedia.org/wiki/Ext3#_note-0
Ya veo, que sea variable es el problema, ¿hay alguna forma de saber cuantos
archivos puede tener un directorio de mi servidor? ¿hay alguna función PHP
para averiguar esto?
Te puedo asegurar que más de los que necesites.
Si, creo que no tengo de que preocuparme, gracias.

Oscar Garcia
2007-04-13 15:02:22 UTC
Permalink
Post by Gonzalo
Post by Oscar Garcia
Post by Gonzalo
y ¿existe algún número máximo de archivos que puede haber en una
directorio?.
http://en.wikipedia.org/wiki/Ext3#_note-0
Ya veo, que sea variable es el problema, ¿hay alguna forma de saber cuantos
archivos puede tener un directorio de mi servidor? ¿hay alguna función PHP
para averiguar esto?
Perdona, no te respondí directamente..

No, no existe una función en PHP específica porque depende del sistema
operativo y del sistema de archivos.

Ya te dí el enlace a la descripción del sistema de archivos ext3 que
suelen usar la mayoría de los servidores linux que existen en internet.
En NTFS y FAT es una cantidad fija, busca en la wikipedia (en ingles) el
nombre de los sistemas de archivos y te saldrá el máximo.

Realmente ext3 me deja confuso porque yo recordaba que realmente no
existía límite en el número de archivos por directorio ya que lo único
que ocurría es que aumentaba el tamaño del directorio y listo.. cada vez
irá ocupando más espacio y más inodos (usa df -i para conocer los inodos
libres de tus sistemas de archivos).

Eso sí, existe una mejora sustancial respecto a ext2 (no recuerdo si
también existe en ext2 siendo sincero) que era el uso de un algoritmo
htree (directorios indexados) que permite un control muy rápido sobre el
contenido de los directorios incluso cuando existen miles de archivos en
su interior.

Bueno.. recuerda que siempre dispones de algún método para aumentar
alguna posible limitación en el número de archivos por directorio.

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Oscar Garcia
2007-04-10 10:35:51 UTC
Permalink
Post by Gonzalo
Post by Oscar Garcia
Para páginas web es un error almacenar imágenes o archivos en la base
de datos, es recomendable guardarlo en un directorio del servidor y
acceder a él cuando necesites la imagen. De ese modo aprovecharás la
caché del navegador, proxies transparentes, etc.. acelerando
notablemente la velocidad de tu web y descargando los recursos del
servidor.
¿y que permiso tengo que darle al directorio carpeta para poder subir las
fotos sin que todo hijo de vecino suba lo que le de la gana?
Ejem... me fui por otro camino...

Limitar la subida... eso lo haces tú mismo.

$_POST['foto']['size'] te dice el tamaño del archivo, de modo que
puedes ir controlando el tamaño máximo para que no sean archivos
demasiado grandes.

Por otro lado tú, como programador del sitio web, pondrías el límite a
los archivos que puede introducir un usuario.

Por ejemplo... si sólo deseas que tenga un archivo (por ejemplo, una
foto para mostrar en un foro) puedes nombrar al archivo con su id más
la extensión de archivo: 1.jpg, 512.jpg, etc.. o con su nombre de
usuario si es único, de modo que automáticamente se sobreescribirá el
viejo con el nuevo cuando suba una nueva foto.

Por otro lado puedes introducir los archivos que envía un usuario en
un directorio (llamado por su id o por su nombre de usuario si es
único) pudiendo contar el número de archivos de varias maneras.

Usando opendir puedes abrir el directorio y contar los archivos que
contiene y, por otro lado, contar el tamaño que ocupan en disco con
filesize (que no se te olvide comprobar si es archivo con is_file).

¿Cómo limitas en la base de datos que nadie abuse? Pues el mismo
método puede usarse de alguna manera en el sistema de archivos y
liberar de ese trabajo al servidor de bases de datos.

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Gonzalo
2007-04-10 12:13:53 UTC
Permalink
Post by Oscar Garcia
Post by Gonzalo
Post by Oscar Garcia
Para páginas web es un error almacenar imágenes o archivos en la base
de datos, es recomendable guardarlo en un directorio del servidor y
acceder a él cuando necesites la imagen. De ese modo aprovecharás la
caché del navegador, proxies transparentes, etc.. acelerando
notablemente la velocidad de tu web y descargando los recursos del
servidor.
¿y que permiso tengo que darle al directorio carpeta para poder subir las
fotos sin que todo hijo de vecino suba lo que le de la gana?
Ejem... me fui por otro camino...
Limitar la subida... eso lo haces tú mismo.
$_POST['foto']['size'] te dice el tamaño del archivo, de modo que
puedes ir controlando el tamaño máximo para que no sean archivos
demasiado grandes.
Por otro lado tú, como programador del sitio web, pondrías el límite a
los archivos que puede introducir un usuario.
(...)
¿Cómo limitas en la base de datos que nadie abuse? Pues el mismo
método puede usarse de alguna manera en el sistema de archivos y
liberar de ese trabajo al servidor de bases de datos.
Si, efectivamente controlo el tamaño de la imagén que suban, no hay
problema si usan mi formulario "subidor", mi miedo es que alguien pueda
subir cosas por su cuenta, sin usar mi formulario, mediante un programa FTP
o como sea, y tengo este miedo porque le tendría que dar permisos al
directorio, ¿no?
También me parece interesante lo que comentas en el otro mensaje para
bloquear que la gente pueda descargar las imágenes almacenadas en un
determinado directorio, pero no se como hacerlo...
Oscar Garcia
2007-04-10 14:14:09 UTC
Permalink
Post by Gonzalo
Si, efectivamente controlo el tamaño de la imagén que suban, no hay
problema si usan mi formulario "subidor", mi miedo es que alguien pueda
subir cosas por su cuenta, sin usar mi formulario, mediante un programa FTP
o como sea, y tengo este miedo porque le tendría que dar permisos al
directorio, ¿no?
No confundas las cosas.. existe exactamente el mismo riesgo de que
alguien te entre por FTP a tu servidor usando bases de datos o
cualquier otro sistema. Ten a buen recaudo los datos de entrada a tu
servidor.
Post by Gonzalo
También me parece interesante lo que comentas en el otro mensaje para
bloquear que la gente pueda descargar las imágenes almacenadas en un
determinado directorio, pero no se como hacerlo...
Busca, por ejemplo, "proteger directorio usando htaccess" en google.

Ya te dí una pista con el deny from all (en caso de denegar TODO y no
sólo pedir credenciales).

Saludos.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...