Dateupload
Verfasst: Freitag 7. Dezember 2007, 09:24
Ich habe leider keine verwertbare Antwort bisher hier gesehen, drum der Thread.
Folgendes eigentlich simples Problem:
Ich habe eine Webseite mit einem Formular
Wie ich gesehen habe gibt es dazu mod_python, cgi, wsgi und tausend andere dinge.
Das ist etwas problematisch, denn ich möchte es gerne allgemein halten. Also habe ich erst einmal versucht die verarbeitung wo anders hin zu verlagern und will nun successive für mod_python und wsgi jeweils eine "entrymethode" definieren.
Bei mod_python fängt das Problem an:
wie man sehen kann habe ich da schon rumgespielt. Mein Problem:
Obiger Code gibt mit am Ende den DateiNAMEN zurück !
Wenn ich allerdings die main methode aufrufe, DANN bekomme ich ein konkretes Bild abgespeichert.
Ich denke es ist (wie üblich bei mir) irgendwo ein dummer Fehler drin der ganz offensichtlich ist.
Wäre dankbar für Hilfe.
Gruß
Hier der komplette Code:
Folgendes eigentlich simples Problem:
Ich habe eine Webseite mit einem Formular
Ich will nun eine Datei auswählen, diese uploaden und anschließend verarbeiten.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Felder für Datei-Upload definieren</title>
</head>
<body>
<h1>Schicken Sie uns was Schickes!</h1>
<form action="imageresizer.py" method="post" enctype="multipart/form-data">
<p>Select a picture (max. size: 2MB):<br>
<input name="file" type="file" size="50" maxlength="2000000" accept="image/*">
</p>
<input type="submit" value=" Absenden ">
<input type="reset" value=" Abbrechen">
</form>
</body>
</html>
Wie ich gesehen habe gibt es dazu mod_python, cgi, wsgi und tausend andere dinge.
Das ist etwas problematisch, denn ich möchte es gerne allgemein halten. Also habe ich erst einmal versucht die verarbeitung wo anders hin zu verlagern und will nun successive für mod_python und wsgi jeweils eine "entrymethode" definieren.
Bei mod_python fängt das Problem an:
Code: Alles auswählen
#entry
#1:gucken ob ein file da ist
#2:gucken ob es kleiner 3 mb ist
#3:einlesen der daten
#4:uebergeben an verarbeitungsmethode
def handler(req):
from mod_python import apache, util
form = util.FieldStorage(req)
if form.has_key('file'):
maxMB=3*1024*1024
if req.headers_in.has_key('content-length'):
if int(req.headers_in['content-length'])>maxMB:
req.write('Error Filesize exeeded 3MB')
req.log_error('filesize to big')
return apache.OK
fileitem = form['file']
if not fileitem.file: return
#data=fileitem.file.read()
data=fileitem.value
imageio = StringIO.StringIO(data)#data)
#imageio.write(data)
#imagestring=imageio.getvalue()
newimage=createImageFromString(imageio,(400,1600))
returnImage(req,newimage)
#req.write(fout.getvalue())
imagestring.close()
return apache.OK
return apache.HTTP_ERROR
Obiger Code gibt mit am Ende den DateiNAMEN zurück !
Wenn ich allerdings die main methode aufrufe, DANN bekomme ich ein konkretes Bild abgespeichert.
Ich denke es ist (wie üblich bei mir) irgendwo ein dummer Fehler drin der ganz offensichtlich ist.
Wäre dankbar für Hilfe.
Gruß
Hier der komplette Code:
Code: Alles auswählen
#!/usr/bin/python
from PIL import Image
import StringIO
def aspectResize(image,newsize,resample):
x, y = image.size
#resize the first that is smaller than the target first
#then shrink again to make the second dimension fit
if x < newsize[0]:
y = max(y * newsize[0] / x, 1)
x = newsize[0]
if y > newsize[1]:
x = max(x * newsize[1] / y, 1)
y = newsize[1]
elif y < newsize[1]:
x = max(x * newsize[1] / y, 1)
y = newsize[1]
if x > newsize[0]:
y = max(y * newsize[0] / x, 1)
x = newsize[0]
size = x, y
if size == image.size:
return image
try:
im = image.resize(size, resample)
except ValueError:
if resample != ANTIALIAS:
raise
im = image.resize(size, NEAREST)
return im
#used when newsize is only given for one dimension
def clearUndefinedSize(oldsize,newsize):
if newsize[0]==0:
newsize[0]=oldsize[0]
if newsize[1]==0:
newsize[1]=oldsize[1]
return newsize
def createImageFromString(file,newsize,aspectRatio=True):
image = Image.open(file)
oldsize=image.size
if oldsize[0]>newsize[0] or oldsize[1]>newsize[1]:
newsize=clearUndefinedSize(oldsize,newsize)
image.thumbnail(newsize,Image.ANTIALIAS)
else:
newsize=clearUndefinedSize(oldsize,newsize)
image=aspectResize(image,newsize,Image.ANTIALIAS)
return image
def returnImage(req,image):
req.content_type = 'image/jpg'
req.send_http_header()
req.write(image.tostring())
return apache.OK
def handler(req):
from mod_python import apache, util
form = util.FieldStorage(req)
if form.has_key('file'):
maxMB=3*1024*1024
if req.headers_in.has_key('content-length'):
if int(req.headers_in['content-length'])>maxMB:
req.write('Error Filesize exeeded 3MB')
req.log_error('filesize to big')
return apache.OK
fileitem = form['file']
if not fileitem.file: return
#data=fileitem.file.read()
data=fileitem.value
imageio = StringIO.StringIO(data)#data)
#imageio.write(data)
#imagestring=imageio.getvalue()
newimage=createImageFromString(imageio,(400,1600))
returnImage(req,newimage)
#req.write(fout.getvalue())
imagestring.close()
return apache.OK
return apache.HTTP_ERROR
if __name__ == '__main__':
file = open('test.jpg','rb')
fileString = StringIO.StringIO(file.read())
newimage=createImageFromString(fileString,(400,1600))
newimage.save('c:/test2.jpg')