Verfasst: Mittwoch 22. November 2006, 13:47
Ja, genau, warum nicht... Wobei, das soll das "if f:" bringen? Wenn du einen fehler beim öffnen abfangen willst, solltest du das mit einem try-except um f=file() machen 

Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Stimmt - man kann auch einfach das Schreibrecht nur für den User des Serverprozesses geben und damit ist das gelöst.jens hat geschrieben:Einfach ist es allerdings ein Verz. zu erstellen, das Schreibrechte für alle zu geben und dann dorthin die Daten zu speichern. Ich mag es alledings nicht so gern, ein Verz. mit Schreibrechte für alle
Genau.Leonidas hat geschrieben:Stimmt - man kann auch einfach das Schreibrecht nur für den User des Serverprozesses geben und damit ist das gelöst.
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
# File: test.py
import wx
import MySQLdb
import base64
HOST = 'localhost'
PORT = 3306
USER = 'FPK'
PASSW = 'kmmanager'
DB = 'afv'
"""
CREATE TABLE test (
`test_id` int(10) unsigned NOT NULL auto_increment,
`test_blob` blob,
PRIMARY KEY (`test_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
#------------------------------------------------------------------------
class MyFrame(wx.Dialog):
def __init__(self, parent, title):
wx.Dialog.__init__(self, parent, -1, title,
pos=(150, 150), size=(300, 350))
self.ConnectToDB()
panel = wx.Panel(self, -1)
self.emptyBmp = wx.EmptyBitmap(width=400, height=400)
self.pic = wx.StaticBitmap(panel, -1, self.emptyBmp)
self.btn_Load = wx.Button(panel, -1, 'Lade und speichere Bild')
self.btn_Load.Bind(wx.EVT_BUTTON, self.LoadPic)
self.btn_Remove = wx.Button(panel, -1, 'Entferne Bild')
self.btn_Remove.Bind(wx.EVT_BUTTON, self.RemovePic)
self.btn_Remove.Disable()
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(self.btn_Load, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
btn_sizer.Add(self.btn_Remove, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.pic, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
main_sizer.Add(btn_sizer, 0, wx.ALL|wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
panel.SetSizer(main_sizer)
main_sizer.Fit(self)
self.main_sizer = main_sizer
self.Bind(wx.EVT_CLOSE, self.OnClose)
#------------------------------------------------------------------------
def LoadPic(self, event):
wildcard = "Alle Bilddateien|*.bmp;*.jpg;*.png;*.jpeg;*.gif"
dlg = wx.FileDialog(
self, message='Wähle eine Bilddatei', defaultDir=wx.StandardPaths.Get().GetUserConfigDir(),
defaultFile="", wildcard=wildcard, style=wx.OPEN | wx.FILE_MUST_EXIST
)
if dlg.ShowModal() == wx.ID_OK:
file_path = dlg.GetPaths()[0]
image = wx.Image(file_path, wx.BITMAP_TYPE_ANY)
self.SetPictureImage(image)
f = file(file_path, 'r')
data = f.read()
data = base64.encodestring(data)
self.SQL('INSERT INTO test SET test_blob=' + data + ';')
f.close()
self.btn_Remove.Enable()
if event:
event.Skip()
#-------------------------------------------------
def SetPictureImage(self, image):
w, h = float(image.GetWidth()), float(image.GetHeight())
targetSize = 400.0
if h != targetSize:
scale = h / targetSize
image = image.Scale(w / scale, h / scale)
bmp = wx.BitmapFromImage(image)
self.pic.SetSize((bmp.GetWidth(), bmp.GetHeight()))
self.pic.SetBitmap(bmp)
self.main_sizer.Layout()
#------------------------------------------------------------------------
def RemovePic(self, event):
self.pic.SetBitmap(self.emptyBmp)
self.btn_Remove.Disable()
#------------------------------------------------------------------------
def ConnectToDB(self):
self.Con = MySQLdb.Connect(host = HOST,
port = PORT,
user = USER,
passwd = PASSW,
db = DB)
#------------------------------------------------------------------------
def SQL(self, statement):
Cursor = self.Con.cursor()
Cursor.execute(statement)
result = Cursor.fetchall()
self.Con.commit()
return result
#------------------------------------------------------------------------
def OnClose(self, event):
self.Con.close()
self.Destroy()
#------------------------------------------------------------------------
class MyApp(wx.App):
def OnInit(self):
dialog = MyFrame(None, 'Bild in Blob speichern')
if dialog.ShowModal() == wx.ID_OK:
print dialog.object.GetDate()
return True
app = MyApp(0)
app.MainLoop()
Code: Alles auswählen
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/9j/4AAQSkZJRgABAgEASABIAAD/4Q8cRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAE=' at line 1")
Code: Alles auswählen
...
f = file(file_path, 'r')
data = f.read()
f.close()
data = base64.encodestring(data)
self.SQL('INSERT INTO test SET test_blob=%s', (data,))
...
def SQL(self, statement, vals):
Cursor = self.Con.cursor()
if vals:
# Wenn Werte in vals sind
Cursor.execute(statement, vals)
else:
# Wenn leerer Tupel übergeben wurde
Cursor.execute(statement)
result = Cursor.fetchall()
Con.commit()
return result
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
# File: test.py
import wx
import MySQLdb
import base64
HOST = 'localhost'
PORT = 3306
USER = 'FPK'
PASSW = 'kmmanager'
DB = 'afv'
"""
CREATE TABLE test (
`test_id` int(10) unsigned NOT NULL auto_increment,
`test_blob` blob,
PRIMARY KEY (`test_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
#------------------------------------------------------------------------
class MyFrame(wx.Dialog):
def __init__(self, parent, title):
wx.Dialog.__init__(self, parent, -1, title,
pos=(150, 150), size=(300, 350))
self.ConnectToDB()
panel = wx.Panel(self, -1)
self.emptyBmp = wx.EmptyBitmap(width=400, height=400)
self.pic = wx.StaticBitmap(panel, -1, self.emptyBmp)
self.btn_Load = wx.Button(panel, -1, 'Lade und speichere Bild')
self.btn_Load.Bind(wx.EVT_BUTTON, self.LoadPic)
self.btn_Remove = wx.Button(panel, -1, 'Entferne Bild')
self.btn_Remove.Bind(wx.EVT_BUTTON, self.RemovePic)
self.btn_Remove.Disable()
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(self.btn_Load, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
btn_sizer.Add(self.btn_Remove, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.pic, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
main_sizer.Add(btn_sizer, 0, wx.ALL|wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
panel.SetSizer(main_sizer)
main_sizer.Fit(self)
self.main_sizer = main_sizer
self.Bind(wx.EVT_CLOSE, self.OnClose)
#------------------------------------------------------------------------
def LoadPic(self, event):
wildcard = "Alle Bilddateien|*.bmp;*.jpg;*.png;*.jpeg;*.gif"
dlg = wx.FileDialog(
self, message='Wähle eine Bilddatei', defaultDir=wx.StandardPaths.Get().GetUserConfigDir(),
defaultFile="", wildcard=wildcard, style=wx.OPEN | wx.FILE_MUST_EXIST
)
if dlg.ShowModal() == wx.ID_OK:
file_path = dlg.GetPaths()[0]
image = wx.Image(file_path, wx.BITMAP_TYPE_ANY)
self.SetPictureImage(image)
f = file(file_path, 'rb')
data = f.read()
# data = base64.encodestring(data)
f.close()
self.SQL('INSERT INTO test SET test_blob=%s', [data,])
f.close()
self.btn_Remove.Enable()
if event:
event.Skip()
#-------------------------------------------------
def SetPictureImage(self, image):
w, h = float(image.GetWidth()), float(image.GetHeight())
targetSize = 400.0
if h != targetSize:
scale = h / targetSize
image = image.Scale(w / scale, h / scale)
bmp = wx.BitmapFromImage(image)
self.pic.SetSize((bmp.GetWidth(), bmp.GetHeight()))
self.pic.SetBitmap(bmp)
self.main_sizer.Layout()
#------------------------------------------------------------------------
def RemovePic(self, event):
self.pic.SetBitmap(self.emptyBmp)
self.btn_Remove.Disable()
#------------------------------------------------------------------------
def ConnectToDB(self):
self.Con = MySQLdb.Connect(host = HOST,
port = PORT,
user = USER,
passwd = PASSW,
db = DB)
#------------------------------------------------------------------------
def SQL(self, statement, parameters=None):
Cursor = self.Con.cursor()
Cursor.execute(statement, parameters)
result = Cursor.fetchall()
self.Con.commit()
return result
#------------------------------------------------------------------------
def OnClose(self, event):
self.Con.close()
self.Destroy()
#------------------------------------------------------------------------
class MyApp(wx.App):
def OnInit(self):
dialog = MyFrame(None, 'Bild in Blob speichern')
if dialog.ShowModal() == wx.ID_OK:
print dialog.object.GetDate()
return True
app = MyApp(0)
app.MainLoop()
Code: Alles auswählen
f = file('C:\\Bild.jpg', 'rb')
blobdata = f.read()
f.close()
cursor.execute('INSERT INTO <table> SET test_blob=%s;', [blobdata,])
Sorry, hatte ich zuerst nicht gesehen. Die Serveranwendung besteht also lediglich aus der DB. Alles andere ist clientseitig implementiert. Richtig?JR hat geschrieben:Weshalb ich das mache, habe ich oben beschrieben.