Foros del Web » Programando para Internet » PHP »

Problema al cargar archivos

Estas en el tema de Problema al cargar archivos en el foro de PHP en Foros del Web. Hola a todos: Quiero guardar diferentes archivos en mi base de datos postgres, ya sea doc, exe, pdf, text, etc. en binario; vi una FAQ ...
  #1 (permalink)  
Antiguo 28/02/2005, 16:06
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Problema al cargar archivos

Hola a todos:


Quiero guardar diferentes archivos en mi base de datos postgres, ya sea doc, exe, pdf, text, etc. en binario; vi una FAQ en este sitio que me ayudo mucho pero tengo 2 problemas:

1- Al intentar guardar en la base de datos un archivo de 30 Mb no me lo permite y no me da ningun error, en los casos en que sean archivos del rango de 0 - 10 Mb aproximadamente me los guarda sin ningun problema. Quisiera que me permitiera guardar archivos grandes en la base de datos porque para eso es el sistema. ¿ Que debo hacer?

2- Al cargar los archivos que hay guardados en la base de datos en binario para verlos en el navegador, no hay ningun problema cuando un archivo es pdf, ppt o word (se ven perfectamente) pero si es un texto o un .exe no se ve, en ese caso sale un dialogo de descarga de la pagina .php


Necesito que alguien me ayude
Se lo agradeceria mucho.

Saludos
  #2 (permalink)  
Antiguo 01/03/2005, 01:44
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
1.- No te da error??... pero supongo tienes tu código de tal manera que te indique si se acabó de ejecutar el script no?... vaya, con mensajes finales de "guardado" ó "no guardado".... según eso, se guardó correctamente?
El que no puedas guardar estos archivos puede ser debido a varios casos...
a) Hay quienes desde el formulario donde se selecciona el archivo insertan un campo oculto marcando el tamaño máximo para trabajar con X archivo
b) Aunque ni idea de Postgres, supongo no es muy diferente a MySQL donde el tipo de campos también hace referencia a un límite del archivo.
c) Quizá al subir un archivo grande excedas el tiempo límite que te da el servidor para ejecutar un script.
d) ... hostin, igual pueden impedirte subir archivos mayores a lo que indiquen...
2.- Qué tipo de texto?.. plano? archivo .txt... raro... pero puede ser un problema de cabeceras. ... ¿Cómo pretendes que se vea un .exe???... esos siempre se van a descargar..

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"

Última edición por jam1138; 01/03/2005 a las 01:45
  #3 (permalink)  
Antiguo 01/03/2005, 06:53
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Muy buenas tus aclaraciones, pero sí tengo el codigo de tal manera que me indique si se insertó o no y el problema es ese que no me dice nada; lo que me hace pensar que es como UD. dice: el script excede el tiempo limite de ejecucion en el servidor (Uso IIS y apache, ¿donde se cambia en cada uno?).

2- El texto que paso es plano es decir .txt, pero la opcion que me da es como ya dije una caja de dialogo para para abrir o descargar el archivo ver_info.php(que es el script que muestra los archivos ya sean .jpg, doc, pdf etc) antes de mostrar el archivo le paso las cabeceras y a pesar de eso no se ve cuando es texto plano.
En el caso de los .exe, tienes razon lo mejor es que le permita descargarlos, pero es que pasa lo mismo que con el anterior sale la opcion de descargar el archivo ver_info.php y si le doy abrir se abre el dreamweaver, que en el caso del texto plano muestra dentro el texto que contenia y en el caso del .exe muestra muchos caracteres raros que es el codigo compilado(me imagino). En fin no me imagino ni se como solucionar el asunto.


Alguna idea ?
Le agradeceria que me ayudara
Saludos
  #4 (permalink)  
Antiguo 01/03/2005, 07:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Muy buenas tus aclaraciones, pero sí tengo el codigo de tal manera que me indique si se insertó o no y el problema es ese que no me dice nada; lo que me hace pensar que es como UD. dice: el script excede el tiempo limite de ejecucion en el servidor (Uso IIS y apache, ¿donde se cambia en cada uno?).
Cuando eso sucede .. PHP arroja un error característico .. otra cosa es que tengas o no configurado PHP para ver ese tipo de errores. Para esto puedes usar:

error_reporting (E_ALL);

al principio de tu script (sólo en modo de desarrollo) para que veas absolutamente todo error/notice que puedas tener y actualmente no veas.

Cita:
1- Al intentar guardar en la base de datos un archivo de 30 Mb no me lo permite y no me da ningun error, en los casos en que sean archivos del rango de 0 - 10 Mb aproximadamente me los guarda sin ningun problema. Quisiera que me permitiera guardar archivos grandes en la base de datos porque para eso es el sistema. ¿ Que debo hacer?
Según parece .. dices que almacenas tu archivo en binario en la BD. También se "supone" que haces el Upload del archivo vía HTTP (con tu formulario HTML y su campo file correspondiente). Si es así recuerda que PHP pone límites al archivo que subes, al tamaño total que puede viajar por "POST" .. y hasta el tiempo de ejecución del script .. también lo puede hacer tu servidor HTTP (Apache?) y hasta tu programación (no vemos el código que usas)...

(bajo mi punto de vista .. no sé como se comportará PostgreSQL en rendimiento .. pero no es lo más óptimo tal vez hacerlo así .. podrías probar guardando la referencia del nombre del archivo y comparar el rendimiento en ambos casos de tu servidor/aplicación).


Cita:
2- Al cargar los archivos que hay guardados en la base de datos en binario para verlos en el navegador, no hay ningun problema cuando un archivo es pdf, ppt o word (se ven perfectamente) pero si es un texto o un .exe no se ve, en ese caso sale un dialogo de descarga de la pagina .php
Bueno .. eso es normal .. no sé que esperas cuando tienes un .exe para descargar. TU navegador .. no asocia un .exe con nada en concreto ..lo mismo con otros formatos MIME de archivos que no reconozca como pueda ser un PDF si es que tienes instalado su plug-in o una imagen .. u otros archivos.

Por seguridad .. un ejectuable .exe nunca se debería ni asociar a nada en concreto .. QUe te lo ofrezca para descargar o para "abrir" es lo que debe hacer y es lo correcto/seguro.


Un saludo,
  #5 (permalink)  
Antiguo 02/03/2005, 08:58
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Pregunta

Este es el script que uso para guardar la informacion en la base de datos postgres, el postgres acepta archivos muy grandes en el campo binario(eso he oido) por lo que en cuanto al tamaño 30 Mb no es una limitacion,en postgres este tipo de dato se llama bytea, que en MySQL el que se usa es blob.
Probe con error_reporting (E_ALL); y tampoco me indica nada.
Aun no se que es lo que pasa.
¿Por qué no lo guarda?

Código PHP:
<?php 
if (isset($_POST['txtTitulo_doc'])  && ($_POST['txtTitulo_doc']<>"")  && (!empty($_FILES['archivo']['name'])) ) {
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'] ; 
$binario_contenido =pg_escape_bytea(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 


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


$sql ="INSERT INTO bibliografia (titulo_doc,  doc_bin,tipo_doc) VALUES ('".$_POST['txtTitulo_doc']."','$binario_contenido','$binario_tipo')";

if (
$dbConexion->Execute($sql)) 
    {
$insertado=true;  
    echo 
"Insertado Correctamente<br>";    } 
    else echo 
"Por alguna razon no se inserto<br>";
?>
Este es el que uso para ver la informacion ya despues que el usuario la seleccionó, mi preocupacion no es solo la de los .exe sino que un texto plano se deberia ver perfectamente pero no sucede así.
Quizas hay alguna manera de hacer para que los archivos para los cuales el navegador no tiene cabeceras permitir que los guarde en la maquina para que los vea posteriormente, ¿Es buena esa idea?
¿Cluster, por qué dices no es muy optimo guardar los archivos directos en la base de datos?
¿Acaso tengo otra opcion?

Código PHP:
<?php 
//mostrar_info.php

include_once("../lib/adodb320/adodb.inc.php");  //Uso ADODB para conectarme
include_once("../Connection/Configuracion.php");
include_once(
"../Connection/Connection.php");

$sql"SELECT * from bibliografia where id_doc='".$_GET['ID']."'";
$rc=$dbConexion->Execute($sql);

$datos =$rc->fields[1];
$tipo $rc->fields[2];  //Aqui tengo el tipo de archivo.

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

Necesito Ayuda
Se la agradeceria
Saludos

Última edición por isaacrc82; 02/03/2005 a las 09:01
  #6 (permalink)  
Antiguo 02/03/2005, 09:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
el postgres acepta archivos muy grandes en el campo binario(eso he oido) por lo que en cuanto al tamaño 30 Mb no es una limitacion,en postgres este tipo de dato se llama bytea, que en MySQL el que se usa es blob.
Bueno .. eso deberías confirmarlo exactamente .. cada tipo de campo acepta cierta cantidad de bytes .. como máximo .. Por ejemplo un BLOB de Mysql son 64Kbytes .. pero para eso están los LongBloB que son como unos 4 GBytes lo que acepta ..


Cita:
Quizas hay alguna manera de hacer para que los archivos para los cuales el navegador no tiene cabeceras permitir que los guarde en la maquina para que los vea posteriormente, ¿Es buena esa idea?
Bueno .. siempre puedes forzar la descarga de un archivo (pese que sea reconocido por el navegador y asociado a su "lector" o "interprete" como podría ser el própio navegador si son imagenes (.jpg, .gif .. etc).

Esas cabeceras son HTTP y se envian por la función header() .. en www.php.net/header tienes algunos ejemplos para "forzar" o mejor dicho "decirle" a tu navegador que los datos que le vas a enviar son para que los "descargue" (y omita toda "asociación" que pudiera tener).

Todas estas cabeceras HTTP .. depende "mucho" del navegador (S.O, versión ..) que uses .. así que no se comportan todos de igual forma ante las mismas cabeceras HTTP. (te lo comento por qué vas hacer tus pruebas y vas a notar que en algunos casos va como tu quieres y en otros no .. en especial Intenet Explorer de M$).

Cita:
¿Cluster, por qué dices no es muy optimo guardar los archivos directos en la base de datos?
Bueno .. como toda BD .. cuanto más dato ha de gestionar .. peor es su rendimiento. No sé PostgreSQL .. pero lo que es Mysql baja mucho el rendimiento si gestionas directamente en binario en tus campos de tu BD archivos (en general: mucho dato) .. Haz tus pruebas y sal de dudas .. tal vez PostgreSQL se comporte mucho mejor que Mysql en ese aspecto.

Por lo demás .. ya te comenté que no sólo hay limites de tu BD (campo que uses) .. sino que PHP en su configuración y hasta tu servidor HTTP puede limitar el tamaño máximo del archivos que sube por HTTP (vía $_FILES) desde tu navegador de pruebas.

Revisa la configuración al respecto (max_upload_file .. etc ..directivas de tu php.ini).

Un saludo,
  #7 (permalink)  
Antiguo 02/03/2005, 12:45
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Muchas gracias cluster y a todos por sus aclaraciones me han despejado varias dudas.
Voy a investigar y despues sigo preguntando.

Saludos
  #8 (permalink)  
Antiguo 06/04/2005, 11:19
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Hola a todos:

Ahora tengo un nuevo problema relacionado con el script que posteé anteriormente y es que no se por qué ahora me sale el siguiente error cuando voy a subir el archivo:

"Warning: fread(): supplied argument is not a valid stream resource in D:\insertar_documento.php on line 236"


Les agradeceria que me ayudaran
Saludos
  #9 (permalink)  
Antiguo 06/04/2005, 12:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Revisa el valor de las variables implicadas .. parece que alguna no está tomando el valor esperado ..

$binario_contenido =pg_escape_bytea(fread(fopen($binario_nombre_tempo ral, "rb"), filesize($binario_nombre_temporal)));

Un saludo,
  #10 (permalink)  
Antiguo 08/04/2005, 10:22
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Bueno es que realmente no entiendo por qué ocurre, porque cuando subo un archivo de 1 o 2 mb sí lo sube y lo guardo sin ningun problema pero por ejemplo si es de 4 mb entonces sí sale el error y todo falla:
'Warning: fread(): supplied argument is not a valid stream resource in D:\insertar_documento.php on line 236'


Aguien podria ayudarme y decirme por qué ocurre esto.

De paso quisiera saber como hacer para configurar el php y el apache para que suba archivos mayores de 10 mb que es un problema que temgo a parte.


Gracias de antemano
Saludos a todos
  #11 (permalink)  
Antiguo 08/04/2005, 11:01
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años
Puntos: 2
Solo un comentario!!

Mira, he leido todo lo que pusieron en este foro, la pregunta principal creo que es: ¿Porque necesitas el archivo completo en la base de datos ?

Lo más optimo y mejor seria hacerlo asi (ejemplo):

1. Creas tu tabla:

tblArchivos
- ArchivoID ID unico de archivo AUTO_INCREMENT
- ArchivoNombre "archivo.txt"
- ArchivoDirectorio "/archivos/"
- ArchivoTipo "TEXTO"

2. Cuando requieres descargar o mostrar un archivo haces esto:

Si ArchivoTipo = "TEXTO"
$contenidoArchivo = LEER EL ARCHIVO(ArchivoDirectorio . ArchivoNombre)
echo $contenidoArchivo
else
//Haces la liga para que se descargue.

De esa forma, todo lo que han hablado en este tema se cumple..

1. Tu quieres ASEGURAR siempre que los archivos texto no son "DESCARGADOS", sino que son mostrados directamente en pantalla.

2. Como han mencionado, archivos exe, zip, pdf, etc. es mejor que sean descargados, eso es lo normal y mas seguro.

3. La base de datos es 100% eficiente, de hecho aun puede haber modificaciones a las columnas de la tabla para hacerlo mucho mas eficiente, pero es un ejemplo basico que seguramente cubre todo lo que necesitarias.

Bueno, este es solo un comentario, y realmente te lo recomiendo, yo guardo en la base de datos solamente archivos que son necesarios totalmente, por ejemplo, previos de imagenes (3k - 5k), y por ejemplo los archivos tipo TEXTO, no me preocupo, los meto directo en un campo de CARACTERES LARGO y ya, no necesito guardar archivos mas grandes, porque realmente no es recomendable (y)

Espero que te sirva de algo te vas a ahorrar muchos dolores de cabeza con este metodo, y tanto apache, MySql y PHP te lo agradeceran
  #12 (permalink)  
Antiguo 08/04/2005, 13:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Bueno es que realmente no entiendo por qué ocurre, porque cuando subo un archivo de 1 o 2 mb sí lo sube y lo guardo sin ningun problema pero por ejemplo si es de 4 mb entonces sí sale el error y todo falla:
Justamente ese es el efecto que origina PHP al no subir el archivo .. no te queda disponible su nombre para que lo abras (fopen() o funciones similares).

También coincide que 2 Mb es el tamaño por defecto que PHP deja subir archivos por HTTP. Directiva:
max_upload_size


Un saludo,
  #13 (permalink)  
Antiguo 20/04/2005, 13:44
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Efectivamente Cluster, para cargar archivos de 32 Mb hay que configurar las directivas (ejemplo):

memory_limit = 128M
post_max_size = 64M
upload_max_filesize = 32M

en el php.ini y reiniciar el apache, si es sobre Linux tambien hay que configurar en el php.conf del apache la directiva:
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 33554432 <----------------------------
</Files>

Ahora, tengo una nueva duda:

El problema es que la maquina se pone extremadamente lenta cuando subo un archivo de sólo !! 7 Mb ¡¡ y yo necesito para el trabajo que estoy haciendo cargar archivos de hasta 1 Giga, para lograr eso tambien tendría que cambiar las directivas en el php.ini para que acepten tamaños de 1 Gb, incluyendo al memory_limit = 1024M ¿Esto no me supondría un problema para la maquina, pues me estaría cogiendo mucha memoria de la RAM?

Escuché que en .NET se pueden cargar archivos de mas de 1 Giga y sólo demora en cargarlos unos pocos segundos pues crea un arreglo de bytes y los pasa por el puerto no sé cual (algo de eso) ¿En php no se puede hacer algo parecido?


Le agradecría mucho a quien me ayudara
Saludos
  #14 (permalink)  
Antiguo 20/04/2005, 14:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
PHP funciona como lo has visto ya .. todo el proceso del Upload lo gestiona el script que lo hace y no libera memoria hasta que termina .. así que subir un archivo de 1GB .. supondría reservar para tu script +de esos GB que pretendas gestionar.

De como funciona .NET (pero que? .. ASP.NET? ...?) no sé personalmente .. pero ya sabes que si tienes oportunidad . .haz tus pruebas. Lo que corresponde a PHP .. no se tiene ningún control del "raw" de los datos que van subiendo ..

No sé que versión de PHP usas .. pero por ejemplo PHP 5 optimiza mejor al parecer el uso de memoria .. podrías hacer tus pruebas también con PHP 5 si no lo usas ya.

Un saludo,
  #15 (permalink)  
Antiguo 20/04/2005, 15:08
 
Fecha de Ingreso: junio-2004
Mensajes: 185
Antigüedad: 19 años, 10 meses
Puntos: 0
Bueno, espero que haya alguna forma porque estoy obligado a hacerlo.

Lo que se hace en ASP.NET es un byte string que agiliza mucho mas la transferencia del fichero, así es como sucede.

Quiero saber si alguien sabe (al menos un indicio) como controlar los datos que se suban para pasarlos de una manera más rapida.

Quizas si existe un metodo diferente, cualquier cosa que me dijeran me serviría para investigar a fondo sobre el tema; despues pondría mis resultados aquí.

Saludos
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 22:02.