31.10.2013 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Grundlagen Web<br />

Bibliotheken<br />

Grundlagen Web<br />

Bibliotheken<br />

Speichern B<strong>in</strong>ärdatei <strong>in</strong> Datenbank<br />

Laden B<strong>in</strong>ärdatei von Datenbank<br />

Passende Datenbank-Struktur<br />

• Tabelle mit Referenz<strong>in</strong>formation<br />

• id, zum Wiederf<strong>in</strong>den<br />

• name, mime, size s<strong>in</strong>d Extras<br />

• Datei als BLOB (B<strong>in</strong>ary Large Object)<br />

mit lobject) <strong>in</strong> Datenbank ablegen<br />

CREATE TABLE b<strong>in</strong> (<br />

id OID PRIMARY KEY,<br />

name TEXT, mime TEXT, size INT<br />

);<br />

...<br />

medien<strong>in</strong>f=> SELECT * FROM b<strong>in</strong>;<br />

id | name | mime | size<br />

-------+-----------------+-----------+-------<br />

31693 | fileupload1.png | image/png | 22595<br />

31694 | fileupload2.png | image/png | 29164<br />

medien<strong>in</strong>f=> \lo_list<br />

Large objects<br />

ID | Owner | Description<br />

-------+-----------+-------------<br />

31693 | medien<strong>in</strong>f |<br />

31694 | medien<strong>in</strong>f |<br />

1 import psycopg2 as pg<br />

2<br />

3 KEY="b<strong>in</strong>arydata"<br />

4 def doit(request): # wenn POST<br />

5 fs = request.files[KEY]<br />

6 blob = fs.stream.read()<br />

7 conn = pg.connect(host="localhost",<br />

8 user="medien<strong>in</strong>f", password="medien<strong>in</strong>f")<br />

9 lo = conn.lobject(0, "wb")<br />

10 lo.write(blob)<br />

11 sql = "INSERT INTO b<strong>in</strong> VALUES "<br />

12 sql += "(%(loid)s, %(name)s, %(type)s, %(size)s)"<br />

13 data = {’loid’: lo.oid, ’name’: fs.filename,<br />

14 ’type’: fs.content_type, ’size’: len(blob)}<br />

15 curs = conn.cursor()<br />

16 curs.execute(sql, data)<br />

17 conn.commit()<br />

18 return "uploaded " + str(lo.oid)<br />

Hochladen mit POST<br />

• Anlegen large object, id<br />

• E<strong>in</strong>tragen Meta-Information <strong>in</strong> Tabelle<br />

• Muss <strong>in</strong> Transaktion se<strong>in</strong><br />

Download Datei von DBMS<br />

• Verwaltungs<strong>in</strong>formationen anhand von<br />

id lesen, zum Beispiel aus<br />

Query-Parameter id<br />

• Lesen des BLOB mit lobject<br />

• Rückgabe von Inhalt der kompletten<br />

Datei mit passenden mimetype zur<br />

Ausgabe<br />

1 from werkzeug.wrappers import Request, Response<br />

2 from dbdownloaddoit import doit<br />

3 page = file("page.tpl").read()<br />

4 img = ’’<br />

5 @Request.application<br />

6 def application(request):<br />

7 if "id" <strong>in</strong> request.args: # das Bid selbst<br />

8 c,mime = doit(<strong>in</strong>t(request.args["id"]))<br />

9 return Response(c, content_type=mime)<br />

10 else: # Rahmen fuer e<strong>in</strong> Beispielbild<br />

11 c = img % {’id’: 31693}<br />

12 dic={’title’:’Image Show’,’content’:c}<br />

13 return Response(page%dic,content_type="text/html")<br />

1 import psycopg2 as pg<br />

2<br />

3 def doit(id): # get image<br />

4 conn = pg.connect(host="localhost",<br />

5 user="medien<strong>in</strong>f", password="medien<strong>in</strong>f")<br />

6 sql = "SELECT mime FROM b<strong>in</strong> WHERE id = %s"<br />

7 curs = conn.cursor()<br />

8 curs.execute(sql, (id, ))<br />

9 res = curs.fetchone()<br />

10 if not res:<br />

11 return "Ke<strong>in</strong> Image", "text/pla<strong>in</strong>"<br />

12 lo = conn.lobject(id, "rb")<br />

13 blob = lo.read()<br />

14 return blob, res[0]<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 85 / 91<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 86 / 91<br />

Grundlagen Web<br />

Bibliotheken<br />

Grundlagen Web<br />

Bibliotheken<br />

Bilder erzeugen mit Image<br />

PDF erzeugen mit reportlab<br />

Alle bekannten Bibliotheken verwendbar<br />

• Beispiel Image<br />

• Zeichnen mit ImageDraw,<br />

• Fonts mit ImageFont<br />

Anzeige e<strong>in</strong>es selbstgebauten Buttons<br />

• Laden e<strong>in</strong>es Templates button.png<br />

• Füllen des Templates mit Text, Text <strong>in</strong><br />

spezifischem Font (Vera) und Größe<br />

(16)<br />

• Ausgabe <strong>in</strong> Str<strong>in</strong>g über cStr<strong>in</strong>gIO da<br />

nur save möglich<br />

Beispiel<br />

• button.png<br />

• http://localhost:8080<br />

• http:.../?text=HS+Rhe<strong>in</strong>Ma<strong>in</strong><br />

1 from werkzeug.wrappers import Request, Response<br />

2 import Image, ImageDraw, ImageFont, cStr<strong>in</strong>gIO<br />

3 fp = "/usr/share/fonts/truetype/"<br />

4 fp += "ttf-bitstream-vera/Vera.ttf"<br />

5 fontsize = 16<br />

6 @Request.application<br />

7 def application(request):<br />

8 text = "Button"<br />

9 if "text" <strong>in</strong> request.args:<br />

10 text = request.args["text"]<br />

11 im = Image.open("button.png")<br />

12 draw = ImageDraw.Draw(im)<br />

13 font = ImageFont.truetype(fp, fontsize)<br />

14 twidth, theight = font.getsize(text)<br />

15 imwidth, imheight = im.size<br />

16 x, y = imwidth/2-twidth/2, imheight/2-(theight/2)<br />

17 draw.text((x, y), text, font=font, fill="black")<br />

18 output = cStr<strong>in</strong>gIO.Str<strong>in</strong>gIO()<br />

19 im.save(output, format="PNG")<br />

20 content = output.getvalue()<br />

21 return Response(content,content_type="image/png")<br />

reportlab<br />

• Bibliothek (frei) zum Erzeugen von<br />

PDF<br />

• Auch Formulare und Textsatz möglich<br />

• E<strong>in</strong>faches Beispiel mit absoluter<br />

Positionierung (auf Canvas zeichnen),<br />

Quadratzahlen<br />

1 from werkzeug.wrappers import Request, Response<br />

2 import cStr<strong>in</strong>gIO<br />

3 from reportlab.pdfgen import canvas<br />

4<br />

5 @Request.application<br />

6 def application(request):<br />

7 output = cStr<strong>in</strong>gIO.Str<strong>in</strong>gIO()<br />

8 c = canvas.Canvas(output)<br />

9 i = 0<br />

10 for x <strong>in</strong> range(50, 500, 85):<br />

11 c.drawStr<strong>in</strong>g(x, 810, "Zahl")<br />

12 c.drawStr<strong>in</strong>g(x+33, 810, "Quadrat")<br />

13 for y <strong>in</strong> range(50, 800, 15):<br />

14 c.drawStr<strong>in</strong>g(x, 842-y, "%d"%i)<br />

15 c.drawStr<strong>in</strong>g(x+33, 842-y, "%d"%(i*i))<br />

16 i += 1<br />

17 c.save()<br />

18 content= output.getvalue()<br />

19 mime = "application/pdf"<br />

20 return Response(content,content_type=mime)<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 87 / 91<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 88 / 91

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!