4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
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