[LUGOS-PROG] binarne datoteke v MySQL

Jure Koren jure at kiss.uni-lj.si
Fri Sep 14 09:48:47 CEST 2001


On Thu, Sep 13, 2001 at 11:17:39PM +0200, Damir Dezeljin wrote:
> Pozdravljeni,
> na disku imam en kup binarnih datotek dolgih 322 bajtov. Zdaj bi rad te
> datoteke dal v SQL bazo. Prvo vprasanje se nanasa na tip BLOB ... kaj ce
> definiram eno celico kot BLOB(400) bo ta celica se avtomatsko
> prilagodila dolzini vsebine do najvec 400 bajtov, ali bo vedno bila 400
> bajtov - tega pac iz manuala ne razumem.

Ja, vsak BLOB je dolg toliko, kot podatki, ki jih zbases not. Tisti (400) ti
samo pove, da bo vsak podatek vecji od 400 tam odrezalo.

> Drugo vprasanje pa ... kako naj to datoteko dam v SQL - najrajsi bi to
> nekako naredil v command line , ce ne gre drugace pa s kakim PHPjem -
> pac v manualu sem naletel na opozorilo da moram razne characterje kot so
> ASCII 0, '\', ''',... eskejpat, vendar tega v command line ne znam.
> Lahko bi sicer napisal progy v Cju za to, vendar se bojim da se mi bo na
> koncu izkazalo da sem kaj falu in bom unicil podatke :)

#!/usr/bin/env python

# importas module
import MySQLdb, sys

# skonektas v bazo in naredis kurzor
DBC = MySQLdb.connect(host='', user='jaz', passwd='stupid', db='mojdb')
DB = DBC.cursor()

gres po vseh parametrih skripte razen 0 (ki je ime skripte)
for file in sys.argv[1:]:
  
  # odpres file
  f = open(file, 'r')
  
  # preberes file v blob in ga escapas
  blob = MySQLdb.escape_string(f.read()))

  # shranis blob in filename v tabelo
  DB.execute("insert into mojatabela set blobstolpec='%s', file='%s'" %
           (blob, file))

  # zapres file
  f.close()


In to je to :) python power, 3 minute dela (ker imam 4800bps terminal).
Potem gres v dir kjer imas file (ali pa mogoce find | xargs skripta.py)
in pozenes skripta.py * in je narejeno.

> Kaj pa potem ko bo bog dal in bo to v bazi ... kako najlazje dobim to iz
> baze nazaj v datoteko (po moznosti s PHPjem)?

V PHP je najlazje tako: mysql_query(select blob where file=$file),
potem pa mysql_fetch_row() potem pa $f = open($file,"w") (ce se ne motim)
in write($f, $blob) al kako ze. Verjetno (ce bos te fajle posiljal clientu)
ne bos rabil delat fajla na disku, ampak samo pljunes header("Content-Type:
tvoj/mime") in enostavno echojas $blob, tako bo client dobil kar ta file,
ce je image pac das image/jpeg, in tako naprej za druge mime.


-- 
Jure Koren                      |                       unix administrator
jure at kiss.uni-lj.si             |             gnu/Linux software developer



More information about the lugos-prog mailing list