Foros del Web » Programando para Internet » PHP »

Tutorial ejemplo: Subir archivos a tu BD (guardando en la BD en binario)

Estas en el tema de Tutorial ejemplo: Subir archivos a tu BD (guardando en la BD en binario) en el foro de PHP en Foros del Web. Bueno, visto las recurrentes preguntas sobre como guardar un archivo binario (sea una imagen, un .exe .. o lo que sea) en una Base de ...

  #1 (permalink)  
Antiguo 28/04/2003, 12:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Tutorial ejemplo: Subir archivos a tu BD (guardando en la BD en binario)

Bueno, visto las recurrentes preguntas sobre como guardar un archivo binario (sea una imagen, un .exe .. o lo que sea) en una Base de datos (Mysql) y guardando integramente el archivo en un campo de la BD .. aquí va un ejemplo completo.

Se usa el array $_FILES[] ... así q solo funcionará bajo PHP 4.1.x o superior .. Por supuesto, el "Upload" de archivos ha de estar habilitado y configurado en el servidor que se use ..

Más info sobre configuración del tema "Upload":
http://www.php.net/manual/en/features.file-upload.php

Es muy básico el sistema .. pero está completo. Faltan muchos detalles de validación.

Si quieren añadir mas datos adjuntos al archivo que suban .. solo tienen que añadir mas campos a la tabla 'archivos' y modificar las consultas implicadas (SQL) junto con el própio formulario HTML (tan solo añadir sus campos extra ..)

El código se divide en varios scripts .. El nombre de cada uno creo q es bastante explicativo .. cualquier duda .. pregunten:

Estructura SQL de la tabla que vamos a emplear:
Código:
#
# Estructura de tabla para la tabla `archivos`
#

CREATE TABLE archivos (
  id int(10) unsigned NOT NULL auto_increment,
  archivo_binario blob NOT NULL,
  archivo_nombre varchar(255) NOT NULL default '',
  archivo_peso varchar(15) NOT NULL default '',
  archivo_tipo varchar(25) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

formulario.php
Código PHP:
<HTML>
<HEAD>
<TITLE>Binario a BD</TITLE>
</HEAD>
<BODY>
<?php
if (isset($_GET['proceso'])){
echo 
$_GET['proceso']."<br>";
}
?>
<FORM enctype="multipart/form-data" method="post" action="insertar.php">
Archivo: <INPUT type="file" name="archivo" size="30">
<INPUT type="submit" name="submit" value="Subir archivo">
</FORM>
</BODY>
</HTML>
insertar.php
Código PHP:
<?php
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
// No se comprueba aqui si se ha subido correctamente.
if (empty($_FILES['archivo']['name'])){
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit;
}

//establece una conexión con la base de datos.
$conexion mysql_connect("localhost","","") or die("No se pudo realizar la conexion con el servidor.");
mysql_select_db("tu_bd",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca.

// archivo temporal (ruta y nombre).
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'] ;

// leer del archvio temporal .. el binario subido.
// "rb" para Windows .. Linux parece q con "r" sobra ...
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal)));

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo.
$binario_nombre=$_FILES['archivo']['name'];
$binario_peso=$_FILES['archivo']['size'];
$binario_tipo=$_FILES['archivo']['type'];

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO archivos (id, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: listar_imagenes.php");  // si ha ido todo bien
exit;
?>
ver.php

Se puede usar directamente llamandolo via un tag HTML de imagen:

<img src="ver.php?id=nºregistro_archivo">

Código PHP:
<?php
if(isset($_GET['id'])) {

    
// you may have to modify login information for your database server:
    
$conexion=mysql_connect("localhost","","") or die ("no se ha podido conectar a la BD");

    
mysql_select_db("tu_bd") or die ("no se ha podido seleccionar la BD");

    
$sql "SELECT archivo_nombre,archivo_binario,archivo_tipo,archivo_peso FROM archivos WHERE id='".$_GET['id']."'";

    
$consulta mysql_query($sql,$conexion);

    
$datos mysql_result($consulta,0,"archivo_binario");
    
$tipo mysql_result($consulta,0,"archivo_tipo");
    
$nombre mysql_result($consulta,0,"archivo_nombre");
    
$peso mysql_result($consulta,0,"archivo_peso");


    
header("Content-type: $tipo");
    
header("Content-length: $peso"); 
    
header("Content-Disposition: inline; filename=$nombre"); 
 
   echo 
$datos;

}
?>
listar_imagenes.php

Un ejemplo completo orientado a listar imagenes (todas) las que contenga nuestra BD junto con el resto de información sobre el archivo que hemos guardado ..

Código PHP:
<?php
    mysql_connect
("localhost","","") or die ("no se ha podido conectar a la BD");

    
mysql_select_db("tu_bd") or die ("no se ha podido seleccionar la BD");

    
$sql "SELECT id,archivo_nombre,archivo_tipo,archivo_peso FROM archivos";
    
$consulta mysql_query($sql) or die ("No se pudo ejecutar la consulta");

    While (
$registro=mysql_fetch_assoc($consulta)){
        echo 
"<img src=\"ver.php?id=".$registro['id']."\">";
        echo 
"<br> Nombre archivo: ".$registro['archivo_nombre'];
        echo 
"<br> Tipo archivo (MIME formato): ".$registro['archivo_tipo'];
        echo 
"<br> Peso: ".$registro['archivo_peso']." bytes.<br><br>";
    }

?>
Y .. otro ejemplo de uso. En este caso se trata de generar "thumbnails" (imagenes pequeñas desde una origen a tamaño real) de las imagenes de la BD.

El uso sería igual que el ver.php. Usa las librerías gráficas GD 1.x en adelante de PHP.

ver_thumbnail.php
Código PHP:
<?php

// OJO, sólo funciona con imagnes en formato JPEG ...

if(isset($_GET['id'])) {

    
$conexion=mysql_connect("localhost","","") or die ("no se ha podido conectar a la BD");
    
mysql_select_db("tu_bd") or die ("no se ha podido seleccionar la BD");
    
$sql "SELECT archivo_binario,archivo_tipo,archivo_nombre FROM archivos WHERE id='".$_GET['id']."'";
    
$consulta mysql_query($sql,$conexion);
    
$imagen mysql_result($consulta,0,"archivo_binario");

    
// Envio cabeceras al navegador .. se indica que lo "que vá" es una imagen de formato MIME JPEG
    
Header ("Content-type: image/jpeg");

    
// Generar el thumbnail:

    // Se crea la imagen desde el campo binario de la BD
    
$img imagecreatefromstring($imagen);

    
// Tamaño del Thumbanil (de la imagen a generar ..)
    
$picsize 123;
    
    
// Se obtienen los datos del ancho y alto de la imagen.
    
$new_w imagesx($img);
    
$new_h imagesy($img);

    
// Se calcula la relación alto/ancho
    
$aspect_ratio $new_h $new_w;
    
    
// Se ajusta al nuevo tamaño
    
$new_w $picsize;
    
$new_h abs($new_w $aspect_ratio);

    
// Se crea la mascara de la imagen nueva
    
$dst_img imagecreate($new_w,$new_h);

    
// Se copia y reajusta el nuevo tamaño en la nueva imagen.
    
imagecopyresized($dst_img,$img,0,0,0,0,$new_w,$new_h,imagesx($img),imagesy($img));

    
// Se entrega al buffer de salida (navegador en este caso) la imagen en formato JPEG
    // El tercer parámetro (100) indica la calidad de la imagen: en porcentaje relación calidad/peso imagen.
    
imagejpeg($dst_img,'',100);
}

?>
Si usan GD versión 2.x pueden sustituir el código de estos bloques por:

Código PHP:
// Se crea la mascara de la imagen nueva
    
$dst_img ImageCreateTrueColor($new_w,$new_h);

// Se copia y reajusta el nuevo tamaño en la nueva imagen.
     
imagecopyresampled($dst_img,$img,0,0,0,0,$new_w,$new_h,imagesx($img),imagesy($img)); 
Con lo cual se ganará en profundidad de color (=mejor calidad ..)

NOTA: El artículo está usando campos tipo BLOD para almacenar el archivo binario. Su limite es de 65535 bytes (64 Kbytes), si desean almacenar archivos de peso superior deben de cambiar el tipo de campo "archivo_binaro" a un MEDIUMBLOB (16Mbytes max.) o a un LONGBLOB (4 Gbytes). Más info al respecto en:

http://www.mysql.com/doc/en/Column_types.html

Actualización (18/08/2004): Solventado problema (bug) en la creación de los "thumbnails". El recurso de imagen para imagesx() e imagesy() no era $src_img sino $img.

Actualización (07/07/2006): Se añaden más cabeceras HTTP al script ver.php para indicar el tipo de archivo que se envia. (Agradecimientos a Prink).

Actualización (14/10/2008): Se corrige consulta SQL de ver.php la cual no hace mención al campo "archivo_peso" para componer a su vez las cabeceras HTTP que envian la imagen finalmente.

Actualización (03/12/2008): Se corrige consulta SQL de ver.php la cual hace mención al campo "archivo_mombre" cuando debería ser "archivo_nombre". (Agradecimientos a zetluis)

Un saludo,

Última edición por Cluster; 03/12/2008 a las 12:45
  #2 (permalink)  
Antiguo 28/04/2003, 12:56
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
De acuerdo




Que puedo decir, eres grande amigo, gracias por el ejemplo, funciona, no cabe duda que el legirte moderador, por parte de los Foros del Web, ha sido lo mejor.

Gracias y Saludos, si tuvieramos alguna duda te comentamos.

Y tienes razon es mejo trabajarlo así ya que de las otras formas las variables register_global causan mucho problema.

Saludos.
  #3 (permalink)  
Antiguo 28/04/2003, 16:07
Avatar de fmmeson  
Fecha de Ingreso: enero-2002
Ubicación: Tucuman
Mensajes: 401
Antigüedad: 22 años, 11 meses
Puntos: 2
hola amigo cluster.....la verdad exelente el scripts
hay algo que creo, a mi parecer , hay que aclarar... este tipo de metodo NO es recomendado para cuando tenemos muchos archivos o imagenes a guardar en la base de datos.....ya que CASTIGAN DRASTICAMENTE las consultas y en general toda la aplicacion WeB. La solucion a esto seria....como digo siempre, a mi parecer....solo incluir en la base de datos la direccion en disco de donde se encuentra el archivo o imagen.....y de esta forma optimizar el rendimiento de la BD.


Un Saludo!!!!!
  #4 (permalink)  
Antiguo 28/04/2003, 16:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Si, fmmeson .. estoy deacuerdo en tu acotación .. Pero tambien hay q evaluar el tipo de proyecto que necestias guardar ese tipo de archivos binarios ..

Si tienes muchos archivos de poco peso (pongamos 50Kbytes max.) .. Acceder via consulta SQL es mas rápido (dicen) que incluso acceder al sistema de archivos del servidor ..

Si tus imagenes son "pesadas" (hablemos de Megabytes) y son pocas .. es recomendable solo "linkearlas" en tu BD ..

Tambien es cierto que el espacio asignado a la BD (en Kbytes) no es ilimitado y suele ser mucho menor que el que nos asignan para el FTP en servicios de Hosting .. Ese es otro punto a tener en cuenta.

Yo no estoy diciendo que este método sea el menjor .. es solo un tutorial de una de las opciones para gestionar archivos via una BD.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 28/04/2003, 17:15
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
Se han dado cuenta que en el archivo ver.php tambien podrían incluirse rutinas para dar seguimiento a las vistas que tiene cada archivo?

Digamos que mando un email en formato html que contiene la siguiente imagen: <img src=\"ver.php?id=125">

Y en ver.php hago algo así...

Código PHP:
                    <?
    $conexion
=mysql_connect("localhost","","") or die ("no se ha podido conectar a la BD");

    
mysql_select_db("tu_bd") or die ("no se ha podido seleccionar la BD");

                
$browser=$HTTP_USER_AGENT;
                
$direccion=gethostbyaddr ($REMOTE_ADDR);
                
$lengua=$HTTP_ACCEPT_LANGUAGE;
                if (!isset(
$ya))
                {
                    
$ya="si";
                    
session_register("ya");
                    
mysql_query("insert into contador (visitaID,fechahora,IP,browser,idioma) values(NULL,Now(),'$direccion','$browser','$lengua')");
                }

if(isset(
$_GET['id'])) {

    
// you may have to modify login information for your database server:
    
$conexion=mysql_connect("localhost","","") or die ("no se ha podido conectar a la BD");

    
mysql_select_db("tu_bd") or die ("no se ha podido seleccionar la BD");

    
$sql "SELECT archivo_binario,archivo_tipo FROM archivos WHERE id='".$_GET['id']."'";

    
$consulta mysql_query($sql,$conexion);

    
$datos mysql_result($consulta,0,"archivo_binario");
    
$tipo mysql_result($consulta,0,"archivo_tipo");

    
header("Content-type: $tipo");
    echo 
$datos;

}
__________________
Manoloweb
  #6 (permalink)  
Antiguo 28/04/2003, 17:18
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
Bueno, solo copie y pegue parte de un codigo que tengo...

Pero la idea es esa... puedes guardar información de la persona que esta viendo tu imagen desde un mail o desde una pagina web...

Saludos!!
__________________
Manoloweb
  #7 (permalink)  
Antiguo 28/04/2003, 17:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Manoloweb ..

No es necesario que repitas los datos de conexión a la BD .. Puedes meter ese código (y debes hacerlo) bajo el "IF" ..

Tambien se vé que usas otra tabla para guardarte esos datos estadisticos de acceso, OK, pero sería bueno que pusieras el la estructura de la esa tabla SQL "contador" .. ademas que si usas el ID en la tabla del "contador" como un dato mas de tu registro podrías incluso hacer consultas tipo: "quien (IP,navegador etc) descargó tal archivo" ...

Como veran .. las posibilidades son "infinitas" .. el ejmplo está abierto para que lo adapten a sus necesidades. No se olviden de mejorar el tema de "seguridad" y validación de datos .. sobre todo para verificar si el archivo a subido completamente al servidor o si se insertó correctamente el registro en la BD ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 28/04/2003, 17:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Ok, Manoloweb .. esa es la idea . trabajando con BD solo hay que usar el ID de la tabla "archivos" para asociarlo a otras tablas como por ejemplo esa de "estadisticas" o cualquier otra ..

Tambien se pueden hacer "UPDATE" a un campo extra de esa misma tabla en ver.php para llevar contabilizados el total de veces que se "ve" ese archivo ... Cosa que mas completa sería como comenta Manoloweb y asociando el ID como menciono.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 28/04/2003, 19:00
 
Fecha de Ingreso: abril-2003
Ubicación: Guatemala
Mensajes: 93
Antigüedad: 21 años, 8 meses
Puntos: 1
tengo que admitir que son unos genios

he estado detras de esto desde hace ya algun tiempo
y nadie me pudo dar la respuesta......yo apenas estoy empezando y ustedes ya llegaron...heheheh....el unico problema que tengo es el "open_basedir restriction" pero supongo que se soluciona con la configuracion.....mi problema es que mi servidor no es mi computadora.....sino es un o por ahi "www.miarroba.com" supongo que es alli donde tengo el problema....voy a seguir probando a ver que pasa.....
cuando hago ver la imagen.....esta no me sale.....solo los datos eso se debe a que no me deja meterlo supongo por lo mismo del open_basedir restriction.....

muchas gracias por su ayuda.......si hubiera una forma de aprender bien el php...me gustaria que me lo hicieran saber....


saludos y gracias

Jose Miguel
  #10 (permalink)  
Antiguo 28/04/2003, 21:54
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
Vaya que si la hay...

Ingredientes:

1.- Ganas de aprender
2.- Un tutorial basico (www.desarrolloweb.com - PHP desde cero)
3.- El manual oficial de PHP (puedes bajarlo)
4.- Instalarte tu apache+php+mysql en tu maquina
5.- Comenzar a hacer pruebas
6.- Hacer preguntas cuando algo no te salga bien
7.- Navegar cada que puedas por este foro para ir aprendiendo de lo que otros estan haciendo


Te aseguro que con esa formula, en 6 meses estas haciendo tus propios desarrollos en PHP!

Saludos!
__________________
Manoloweb
  #11 (permalink)  
Antiguo 28/04/2003, 23:01
 
Fecha de Ingreso: abril-2003
Ubicación: Guatemala
Mensajes: 93
Antigüedad: 21 años, 8 meses
Puntos: 1
que pasa si solo quiero sacar un solo archivo no todos

quiero sacar solo un.....supongo que es en base al id....
y tambien sacar el nombre de la foto y tamaño y todo....siempre
con lo que tenemos ahi arriba.....
  #12 (permalink)  
Antiguo 29/04/2003, 08:27
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
No entiendo bien tu pregunta, pero el script ver.php eso es lo que hace, sacar solo una imagen dependiendo del ID...

Para comprobar los tamaños, tienes la función getimagesize()

Buscala en el manual y verás como funciona.

__________________
Manoloweb
  #13 (permalink)  
Antiguo 29/04/2003, 11:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
sicuesn

Fijate en el ejemplo: listar_imagenes.php

Ahí veras la consulta SQL que se hace:

Código PHP:
$sql "SELECT id,archivo_nombre,archivo_tipo,archivo_peso FROM archivos"
Tan solo modifica esa consulta para añadirle tu CONDICIONAL .. ejemplo por el ID del registro:

Código PHP:
$sql "SELECT id,archivo_nombre,archivo_tipo,archivo_peso FROM archivos WHERE id='".$_GET['id']."'"
Guardate ese script con otro nombre (ejemplo ver_un_registro_completo.php) y lo llamas pasandole por el URL el ID del registro completo que quieres ver:

ver_un_registro_completo.php?id=nºregistro

Como veras, solo se trata de hacer "consultas" a esa tabla . y lo único que tienes que tener en cuenta es que hagas lo que hagas .. la imagen la tienes que llamar via el tag HTML de imagen si vas a presentar mas datos ademas de la própia imagen:

Código PHP:
echo "<img src=\"ver.php?id=".$registro['id']."\">"

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 29/04/2003, 11:48
 
Fecha de Ingreso: abril-2003
Ubicación: Guatemala
Mensajes: 93
Antigüedad: 21 años, 8 meses
Puntos: 1
muchas gracias

pensandolo bien....no era tan dificil...hehheeh
hay que usar la logica mas que todo verdad....
gracias te lo agradesco

Saludos

Jose Miguel
  #15 (permalink)  
Antiguo 01/05/2003, 04:13
Avatar de Woody  
Fecha de Ingreso: abril-2003
Ubicación: Madrid y Barcelona
Mensajes: 68
Antigüedad: 21 años, 7 meses
Puntos: 0
Muy, muy, muy bueno

No hay nada como buscar algo y encontrarlo mucho mejor.



Felicidades Cluster.
  #16 (permalink)  
Antiguo 07/05/2003, 01:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Les dejo otro ejemplo de uso: ver_thumbnail.php (en el código principal lo puse a continuación) ..

Se trata de generar "thumbanils" de las imagenes en formato binario que ya tenemos en la BD .. todo en "tiempo real".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #17 (permalink)  
Antiguo 07/05/2003, 09:30
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Gracias, Cluster, por el tutorial, ahora solo es de probarlo, saludos.
  #18 (permalink)  
Antiguo 13/05/2003, 12:50
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Cluster:

Bueno, el tutorial del thumbnail tendría que funcionar en base a el otro que pusiste de subir imagenes, pues lo he estado probando y me marca este error.

Cita:
<br />
<b>Fatal error</b>: Call to undefined function: imagecreatefromstring() in <b>c:\archivos de programa\apache group\apache\htdocs\paginas\rigoqueme\php\phpclust er\yamodificado\thumbnail.php</b> on line <b>22</b><br />
y lo que se tiene en la linea 22 es:

Código PHP:
    $img imagecreatefromstring($imagen); 
me marcó el error al colocarl en el url esto

No se si este llamando mal al archivo, o sea el código el que este mal.

Lo que si es que en tu código original tu tienes esto en donde se define $img:
Código PHP:
$imagen mysql_result($consulta,0,"archivo_binario"); 
Supongo que archivo_binario, es el campo de la tabla que contiene la imagen. Si es así el mío se llama: imagen, no se si sea esto lo que este afectando.

Bueno gracias, y saludos.


Última edición por kawoq; 13/05/2003 a las 12:55
  #19 (permalink)  
Antiguo 13/05/2003, 15:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
kawoq .. ya avisé que ese script para crear los thumbnails REQUIERE de las librerias (extensiones) GD ..

El error que te dá PHP es que no las tienes instaladas...

(busca en el foro o pregunta en un nuevo mensaje como instalarlas indicando el S.O. Windows ..).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #20 (permalink)  
Antiguo 13/05/2003, 16:02
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
ok thks
sorry
Saludos
  #21 (permalink)  
Antiguo 20/05/2003, 17:09
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Una duda sobre el tutorial, antes de darla quisiera decir que ha funcionado bien(no he probado los thumbs aun), y que lo he adaptado para subir noticias, es decir al formulario le agregue Titulo, y cuerpo de la noticia, por supuesto cambie la tabla de la base de datos.

Partiendo de ello, solo tenía una inquietud.
Si la persona no desea subir ningun archivo a la base de datos, ¿se puede evitar que te regrese al formulario?

Código PHP:
if (empty($_FILES['archivo']['name'])){
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit; 
Esto tomando en cuenta que ya no utilizo el formulario para subir solamente una imagen, sino que lo utilizo para subir una nota completa, en la cual se deja a criterio de quien la sube si esta lleva imagen o no.

Se tendrá que poner una condición donde pregunte si fue subido algun archivo, antes de este código:?
Código PHP:
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal)));

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tamaño y tipo.
$binario_nombre=$_FILES['archivo']['name'];
$binario_peso=$_FILES['archivo']['size'];
$binario_tipo=$_FILES['archivo']['type']; 
Solamente gracias.

Última edición por kawoq; 20/05/2003 a las 17:17
  #22 (permalink)  
Antiguo 20/05/2003, 21:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Si claro .. tendrías que usar un condicional

Código PHP:
if (isset($_FILES['archivo']['name'])){

// pones aquí todo el código que procesa la imagen para insertar la imagen y obtener los datos de la misma ..


Ademas puedes usar muchas mas funciones para validar el archivo si ha subido correctamente (y completo) antes de moverlo a la BD .. para dar el aviso correspondiente en caso de fallo ..

Me refiero a funciones como:
is_uploaded_file()

En general .. como tutorial que es no tiene muchas validaciones de datos. El propósito del "tutorial" era el de "enseñar" la técnica de "subir" una imagen (o archivo binario en general) a un campo de una Base de datos (tabla) .. y como obtener dicho dato en una consulta simple.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #23 (permalink)  
Antiguo 21/05/2003, 10:58
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Si gracias, Cluster, pues el tutorial es muy bueno, y eso ayuda a que leas e investigues funciones que uno muchas veces no conoce.

Gracias por la respuesta.

Saludos.

Mira ya estoy intentando colocar el código que me recomendaste, según como lo entendí era que tenía que quitar el IF, que tenía al pricnipio el que comprobaba si se habia subido el archivo, y el If que me dijiste pusiera lo coloce despues de conectar a mi base de datos, al hacerlo así no funciono y me marca lo siguiente(ya intente también dejando el if del principio y solo agregarle este otro)

Cita:
Warning: fopen("", "rb") - Invalid argument in c:\archivos de programa\apache group\apache\htdocs\paginas\ruta\insertar.kwd.php on line 19

Warning: fread(): supplied argument is not a valid File-Handle resource in c:\archivos de programa\apache group\apache\htdocs\paginas\ruta\insertar.kwd.php on line 19

Warning: Cannot add header information - headers already sent by (output started at c:\archivos de programa\apache group\apache\htdocs\paginas\ruta\insertar.kwd.php: 19) in c:\archivos de programa\apache group\apache\htdocs\paginas\ruta\insertar.kwd.php on line 31
Mi código es el siguiente:
Código PHP:
<?php
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
// No se comprueba aqui si se ha subido correctamente.
//establece una conexión con la base de datos.
// acá iba la condición para ver si se habia subido un archivo de lo contrario te regresaba al formulario, esta la borre.

    
$localhost"localhost:3306";
    
$usuario"root";
    
$db="rqch";
    
$conexion mysql_connect("$localhost","$usuario"); 
    
mysql_select_db("$db",$conexion) or die("No se puede seleccionar BD"); 
    
// a continuación puse la otra condición que me recomentaste
if (isset($_FILES['archivo']['name'])){
// archivo temporal (ruta y nombre).
 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'] ;

// leer del archvio temporal .. el binario subido.
// "rb" para Windows .. Linux parece q con "r" sobra ...
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); //linea 19

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tamaño y tipo.


$binario_nombre=$_FILES['archivo']['name'];
$binario_peso=$_FILES['archivo']['size'];
$binario_tipo=$_FILES['archivo']['type'];

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO noticias2 (id, imagen, titulo_noticia, resumen_noticia, cuerpo_nota, fecha) VALUES ('', '$binario_contenido', '$titulo', '$resumen', '$cuerpo', now())";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: index.php");  // (linea 31) si ha ido todo bien 
exit;

}
//fin de la condición y empieza el caso contrario
else {
    
$consulta_insertar "INSERT INTO noticias2 (id, titulo_noticia, resumen_noticia, cuerpo_nota, fecha) VALUES ('', '$titulo', '$resumen', '$cuerpo', now())";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: index.php");  // si ha ido todo bien
exit;
}
?>
Disculpa la molestia y gracias por la respuesta.
  #24 (permalink)  
Antiguo 21/05/2003, 14:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
mm .. ahora que lo miro .. $_FILES['archivo'] siempre estará definido si usas el formulario ejemplo .. así q sería empty() en lugar de isset() ...

Código PHP:
if (!empty($_FILES['archivo']['name'])){ 
Los errores que proboca son por pasarle al fopen() una cadena vacia como nombre de archivo...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #25 (permalink)  
Antiguo 21/05/2003, 15:17
Avatar de kawoq  
Fecha de Ingreso: mayo-2002
Ubicación: Xela
Mensajes: 491
Antigüedad: 22 años, 6 meses
Puntos: 0
Gracias amigo.

Gracias Cluster, funciona, te agradezco hermano, te aviso cuando tenga subido el sitio para que veas como funcion tu tutorial.


Saludos.
  #26 (permalink)  
Antiguo 21/05/2003, 19:06
Avatar de Nukelino  
Fecha de Ingreso: abril-2003
Ubicación: Buenos Aires
Mensajes: 116
Antigüedad: 21 años, 8 meses
Puntos: 0
una pregunta...

Como puedo hacer para que al apretar "examinar" solo se vean las carpetas y los jpg?

Saludoss....
  #27 (permalink)  
Antiguo 21/05/2003, 19:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 11 meses
Puntos: 129
Si se pudiera hacer .. con PHP desde luego que no se haría ...

Pregunta si quieres en foros como HTML o Javascript .. pero desde ya te digo que con el dichoso boton "examinar" no tenemos ningún control ( ni tan siquiera el de separar el <input> del archivo del boton para ponerlo por ejemplo por separados ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #28 (permalink)  
Antiguo 04/06/2003, 09:38
 
Fecha de Ingreso: mayo-2003
Mensajes: 8
Antigüedad: 21 años, 6 meses
Puntos: 1
bueno, al fin he encontrado lo que he buscado durante tanto tiempo, probé el codigo y esta espectacular, el unico problema que no me sube la imagen... , es mas no se donde la debe subir (carpeta), como ya se habrán dado cuenta soy novato en php.

Alguien me lo podria expicar
Gracias
  #29 (permalink)  
Antiguo 04/06/2003, 09:57
 
Fecha de Ingreso: abril-2003
Ubicación: Guatemala
Mensajes: 93
Antigüedad: 21 años, 8 meses
Puntos: 1
La imagen la sube a la base de datos, no a una carpeta..
te subiria al campo "archivo_binario blob NOT NULL"...
lee bien arriba....ahi esta la estructura de la tabla....

Si no entiendes mucho mejor si ves el tutorial
http://www.webestilo.com/php/php07a.phtml

yo aprendi un poco en este tutorial....lo demas depende de ti

Saludos

Jose Miguel
  #30 (permalink)  
Antiguo 04/06/2003, 10:05
 
Fecha de Ingreso: mayo-2003
Mensajes: 8
Antigüedad: 21 años, 6 meses
Puntos: 1
Ups, perdón... te da la pauta que no se mucho.

Muchas Gracias
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.
Tema Cerrado

SíEste tema le ha gustado a 44 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 05:46.