FAQ

[PostgreSQL-ES] Como puedo guardar archivos binarios en una tabla de una BD Postgresql

Victor Montenegro Isidin
Jul 21, 2005 at 12:01 pm
Holas:

Necesito guardar en una tabla de una BD postgres archivos binarios, es
decir, archivos .zip .jpg .doc, etc.
Como puedo subirlos a una BD Postgresql (con PHP)

--
Atte. Victor Montenegro Isidin
F: +56 57 435178
M: +56 082782070
Iquique - Chile
reply

Search Discussions

11 responses

  • Pascual De Ruvo at Jul 21, 2005 at 1:13 pm
    Revisa este ejemplo:

    http://www.buayacorp.com/archivos/guardar-y-recuperar-un-archivo-en-un-campo-blob-de-postgresql-con-php/
    On 7/21/05, Victor Montenegro Isidin wrote:

    Holas:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)

    --
    Atte. Victor Montenegro Isidin
    F: +56 57 435178
    M: +56 082782070
    Iquique - Chile
  • Leonel Nunez at Jul 21, 2005 at 1:22 pm

    Victor Montenegro Isidin wrote:

    Holas:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)

    --
    Atte. Victor Montenegro Isidin
    F: +56 57 435178
    M: +56 082782070
    Iquique - Chile


    Usando el tipo de dato ByteA

    busca en el historico de la lista


    leonel
  • Tyler T at Jul 21, 2005 at 10:33 pm

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)


    Usando el tipo de dato ByteA

    busca en el historico de la lista


    leonel

    Tambien puedes optar por guardar las rutas de en donde se encuentran
    esos archivos, asi te evitas tener que guardar datos binarios en la
    DB, saludos.
  • Leonel Nunez at Jul 21, 2005 at 10:49 pm

    Tyler T wrote:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)

    Usando el tipo de dato ByteA

    busca en el historico de la lista


    leonel


    Tambien puedes optar por guardar las rutas de en donde se encuentran
    esos archivos, asi te evitas tener que guardar datos binarios en la
    DB, saludos.

    ---------------------------(fin del mensaje)---------------------------
    TIP 7: no olvides aumentar la configuración del "free space map"



    Lo malo de mantenerlos asi es que se tiene que hacer algo para
    implementar la integridad entre el "catalogo" y los archivos


    leonel
  • Edwin Quijada at Jul 21, 2005 at 2:52 pm
    Supongo que podrias usar bytea para esto. Yo hice algo asi y uso campo tipo
    text codifcandolo en base64. Lo hago para almacenar fotos. Si mal no
    recuerdo por aca alguein posteo como hacia esto desde php para almacenar
    fotos en PG, Entiendo que el procedimiento es el mismo. Busca en los
    historicos

    *-------------------------------------------------------*
    *-Edwin Quijada
    *-Developer DataBase
    *-JQ Microsistemas
    *-809-747-2787
    * " Si deseas lograr cosas excepcionales debes de hacer cosas fuera de lo
    comun"
    *-------------------------------------------------------*


    From: Victor Montenegro Isidin <vhmontenegro@gmail.com>
    Reply-To: Victor Montenegro Isidin <vhmontenegro@gmail.com>
    To: pgsql-es-ayuda@postgresql.org
    Subject: [pgsql-es-ayuda] Como puedo guardar archivos binarios en una tabla
    de una BD Postgresql
    Date: Thu, 21 Jul 2005 08:00:57 -0400

    Holas:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)

    --
    Atte. Victor Montenegro Isidin
    F: +56 57 435178
    M: +56 082782070
    Iquique - Chile
    _________________________________________________________________
    Visita MSN Latino Noticias: Todo lo que pasa en el mundo y en tu paín, ¡en
    tu idioma! http://latino.msn.com/noticias/
  • Mario Soto Cordones - Venezuela at Jul 21, 2005 at 10:58 pm
    Yo utilizo para ello el tipo lo y funciona perfectamente

    Saludos


    El 21/07/05, Victor Montenegro Isidin<vhmontenegro@gmail.com> escribió:
    Holas:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)

    --
    Atte. Victor Montenegro Isidin
    F: +56 57 435178
    M: +56 082782070
    Iquique - Chile

    --
    cordialmente,

    Ing. Mario Soto Cordones
  • Alvaro Herrera at Jul 22, 2005 at 1:52 am

    On Thu, Jul 21, 2005 at 08:00:57AM -0400, Victor Montenegro Isidin wrote:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)
    Resumiendo todas las respuestas que dieron, tienes 4 opciones:

    1. almacenar el archivo fuera de la base de datos, y almacenar solamente
    el PATH. No es mala opcion, pero necesitas un programa externo que haga
    limpieza.

    2. almacenar usando "large objects".

    3. almacenar usando el tipo Bytea. Ventaja: tienes que hacer una
    conversion al insertar y extraer, puesto que hay que escapar los
    caracteres "ascii 0" (NUL), backslash y otros (AFAIR el unico otro es la
    comilla simple). Alternativamente puedes usar un mecanismo que no
    necesite escapar, pero entiendo que no esta implementado en PHP.

    4. almacenar usando el tipo text, codificado en base64 o algun
    equivalente. Desventaja: hay un consumo de CPU no despreciable para
    hacer la conversion (mas costosa que la alternativa 3)


    Con respecto a Bytea y Text, podria ser recomendable desactivar la
    compresion de esa columna, para ahorrar algo de CPU, dependiendo de si
    los archivos que almacenes sean muy compresibles (es una variante de
    ALTER TABLE que dice algo de "STORAGE". Lee el manual.)

    Con respecto a la alternativa 2, es lo que hay en un articulo que habla
    sobre almacenar BLOBs en Postgres que citaba otra persona. Nota que en
    Postgres no existen los "blobs"; aca el equivalente es el tipo Bytea,
    apocope de "byte array". Ademas el autor del articulo comete el error
    de confundir eso con la interfaz de objetos grandes, que es un tema
    completamente distinto.


    Tu tienes que decidir cual de esas alternativas escoger. Una vez que
    hayas escogido te preocupas de ver exactamente como es el codigo para
    hacerlo.

    --
    Alvaro Herrera (<alvherre[a]alvh.no-ip.org>)
    "Nunca se desea ardientemente lo que solo se desea por razón" (F. Alexandre)
  • Martín Marqués at Jul 22, 2005 at 11:43 am
    Por Dios Alvaro, si se hace (o existe) algún FAQ en español de PostgreSQL,
    este mail tienen que estar ahí!!!! :-D

    El Jue 21 Jul 2005 22:52, Alvaro Herrera escribió:
    On Thu, Jul 21, 2005 at 08:00:57AM -0400, Victor Montenegro Isidin wrote:

    Necesito guardar en una tabla de una BD postgres archivos binarios, es
    decir, archivos .zip .jpg .doc, etc.
    Como puedo subirlos a una BD Postgresql (con PHP)
    Resumiendo todas las respuestas que dieron, tienes 4 opciones:

    1. almacenar el archivo fuera de la base de datos, y almacenar solamente
    el PATH. No es mala opcion, pero necesitas un programa externo que haga
    limpieza.

    2. almacenar usando "large objects".

    3. almacenar usando el tipo Bytea. Ventaja: tienes que hacer una
    conversion al insertar y extraer, puesto que hay que escapar los
    caracteres "ascii 0" (NUL), backslash y otros (AFAIR el unico otro es la
    comilla simple). Alternativamente puedes usar un mecanismo que no
    necesite escapar, pero entiendo que no esta implementado en PHP.

    4. almacenar usando el tipo text, codificado en base64 o algun
    equivalente. Desventaja: hay un consumo de CPU no despreciable para
    hacer la conversion (mas costosa que la alternativa 3)


    Con respecto a Bytea y Text, podria ser recomendable desactivar la
    compresion de esa columna, para ahorrar algo de CPU, dependiendo de si
    los archivos que almacenes sean muy compresibles (es una variante de
    ALTER TABLE que dice algo de "STORAGE". Lee el manual.)

    Con respecto a la alternativa 2, es lo que hay en un articulo que habla
    sobre almacenar BLOBs en Postgres que citaba otra persona. Nota que en
    Postgres no existen los "blobs"; aca el equivalente es el tipo Bytea,
    apocope de "byte array". Ademas el autor del articulo comete el error
    de confundir eso con la interfaz de objetos grandes, que es un tema
    completamente distinto.


    Tu tienes que decidir cual de esas alternativas escoger. Una vez que
    hayas escogido te preocupas de ver exactamente como es el codigo para
    hacerlo.

    --
    Alvaro Herrera (<alvherre[a]alvh.no-ip.org>)
    "Nunca se desea ardientemente lo que solo se desea por razón" (F. Alexandre)

    ---------------------------(fin del mensaje)---------------------------
    TIP 8: explain analyze es tu amigo
    --
    select 'mmarques' || '@' || 'unl.edu.ar' AS email;
    ---------------------------------------------------------
    Martín Marqués | Programador, DBA
    Centro de Telemática | Administrador
    Universidad Nacional
    del Litoral
    ---------------------------------------------------------
  • Chema Cortes at Jul 22, 2005 at 12:18 pm

    Alvaro Herrera escribió:

    3. almacenar usando el tipo Bytea. Ventaja: tienes que hacer una
    conversion al insertar y extraer, puesto que hay que escapar los
    caracteres "ascii 0" (NUL), backslash y otros (AFAIR el unico otro es la
    comilla simple). Alternativamente puedes usar un mecanismo que no
    necesite escapar, pero entiendo que no esta implementado en PHP.
    Por si puede servirle a álguien, hice un artículo para manejar binarios
    en postgres con python en el que, de paso, comparo los tres módulos más
    populares que tiene python para conectar con postgres:

    http://ch3m4.org/blog/index.php/py/2005/01/24/manejo_de_blobs_con_postgresql


    Lo de los "escapes" es necesario cuando construyes la "query" en formato
    texto; pero resulta más conveniente pasar los datos binarios como
    parámetro independiente en la ejecución de la query, sin necesidad de
    convertir nada. En el artículo lo explico con el módulo "psycopg" de
    python; en C sería utilizando la función "PQexecParams".


    Lo de usar LO ó ByteA lo pregunté por aquí hace unos meses, y la
    respuesta que obtuve venía a decir que la principal ventaja de los LO es
    que funciona como un fichero normal, pudiendo hacer seeks sobre éllos;
    aunque su principal desventaja es que pierden fácilmente la integridad
    referencial, por lo que parecen más recomendable utilizar ByteA en general.
  • Martín Marqués at Jul 22, 2005 at 12:36 pm

    El Vie 22 Jul 2005 09:18, Chema Cortes escribió:


    Lo de usar LO ó ByteA lo pregunté por aquí hace unos meses, y la
    respuesta que obtuve venía a decir que la principal ventaja de los LO es
    que funciona como un fichero normal, pudiendo hacer seeks sobre éllos;
    aunque su principal desventaja es que pierden fácilmente la integridad
    referencial, por lo que parecen más recomendable utilizar ByteA en general.
    Ahí esta el análisis del programador: ¿vas a hacer busquedas sobre los
    archivos binarios?

    Supongamos que vas a guardar imágenes que luego se levantan en una pagina web
    (se me ocurre la foto de los usuarios). Ahí no hay busqueda que hacer.

    Por otra parte, podrias tener PDFs guardados, y queres hacer una busqueda
    dentro de los PDFs. Ahí tenes que accederlos?

    Todo depende de lo que se necesite. :-D

    --
    select 'mmarques' || '@' || 'unl.edu.ar' AS email;
    ---------------------------------------------------------
    Martín Marqués | Programador, DBA
    Centro de Telemática | Administrador
    Universidad Nacional
    del Litoral
    ---------------------------------------------------------
  • Alvaro Herrera at Jul 22, 2005 at 1:58 pm
    Chema olvidó la copia a la lista. Reenvío su mensaje.

    ----- Forwarded message from Chema Cortes <chema@ls-l.org> -----

    Date: Fri, 22 Jul 2005 14:17:21 +0200
    From: Chema Cortes <chema@ls-l.org>
    Subject: Re: [pgsql-es-ayuda] Como puedo guardar archivos binarios en una tabla
    de una BD Postgresql
    To: Alvaro Herrera <alvherre@alvh.no-ip.org>
    X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=0.95.2

    Alvaro Herrera escribió:
    3. almacenar usando el tipo Bytea. Ventaja: tienes que hacer una
    conversion al insertar y extraer, puesto que hay que escapar los
    caracteres "ascii 0" (NUL), backslash y otros (AFAIR el unico otro es la
    comilla simple). Alternativamente puedes usar un mecanismo que no
    necesite escapar, pero entiendo que no esta implementado en PHP.
    Por si puede servirle a álguien, hice un artículo para manejar binarios
    en postgres con python en el que, de paso, comparo los tres módulos más
    populares que tiene python para conectar con postgres:

    http://ch3m4.org/blog/index.php/py/2005/01/24/manejo_de_blobs_con_postgresql


    Lo de los "escapes" es necesario cuando construyes la "query" en formato
    texto; pero resulta más conveniente pasar los datos binarios como
    parámetro independiente en la ejecución de la query, sin necesidad de
    convertir nada. En el artículo lo explico con el módulo "psycopg" de
    python; en C sería utilizando la función "PQexecParams".


    Lo de usar LO ó ByteA lo pregunté por aquí hace unos meses, y la
    respuesta que obtuve venía a decir que la principal ventaja de los LO es
    que funciona como un fichero normal, pudiendo hacer seeks sobre éllos;
    aunque su principal desventaja es que pierden fácilmente la integridad
    referencial, por lo que parecen más recomendable utilizar ByteA en general.

    ----- End forwarded message -----


    --
    Alvaro Herrera (<alvherre[a]alvh.no-ip.org>)
    "Cuando no hay humildad las personas se degradan" (A. Christie)

Related Discussions