Seite 1 von 2
					
				Upload
				Verfasst: Dienstag 27. Juli 2004, 12:24
				von Hanman
				Hallo,
ich möchte ein kleines Uploadscript coden. Ich möchte jenes auf einem linux Server laufen lassen, realisieren möchte ich es mit Hilfe der ftplib und cgi. Allerdings frage ich mich ob Python an dieser Stelle auf den Rechner des Nutzers oder den Server zugreifft :
conn.storbinary('STOR datei',open('datei','rb'),1024)
Ausserdem frage ich mich ob ich das open(datei... auslagern könnte um dann die Datei größe zu überprüfen und ob ich vor oder während des Transfers den Dateinamen ändern kann.
Nochmal ein wenig Off Topic :
Ich wollte mich, nachdem ich nun einige Zeit dieses Forum nutze, bei den Python Profis bedanken, die mir schon oft aus der Patche zu helfen wussten. Danke! 
 
Gruß Hanman
 
			
					
				
				Verfasst: Dienstag 27. Juli 2004, 12:53
				von Dookie
				Hi Hanman,
erstmal nach Netzwerke und CGI verschieben *schieb* 
 
ich möchte ein kleines Uploadscript coden. Ich möchte jenes auf einem linux Server laufen lassen, realisieren möchte ich es mit Hilfe der ftplib und cgi. Allerdings frage ich mich ob Python an dieser Stelle auf den Rechner des Nutzers oder den Server zugreifft : 
In dem Fall auf beide, das conn.storbinary sendet an den ftp-server das Kommando und open('datei','rb') öffnet die Datei auf dem Client.
Das auslagern von open kannst z.B. so machen:
Code: Alles auswählen
localfilename = 'datei'
serverfilename = 'uploaded'
datei = open(localfilename, 'rb')
conn.storbinary('STOR %s' % serverfilename, datei, 1024)
datei = close()
Dabei wird der Datei auf dem Server auch gleich ein anderer Name verpasst.
Gruß
Dookie
 
			
					
				
				Verfasst: Samstag 31. Juli 2004, 11:59
				von Hanman
				Hallo, erstmal danke Dookie! Ich habe das ganze jetzt versucht, leider klappt es noch nicht ganz so wie es eigentlich sollte. Ich hole  das Bild, das der Benutzer hochladen möchte, über so ein Eingabefeld mit Dateiauswahl. Leider wird anscheinend nur der Dateiname übertragen und nicht der ganze Pfad. Wenn ich einfach o = open("pfad") benutze, also gleich den Pfad zu einem Bild eingebe versucht Python immer das Bild auf dem Server zu öffnen.
Das ist der Fehler :
Traceback (most recent call last):
  File "/home/w11865/.//web/public_html/cgi-bin/upload.py", line 31, in ?
    o = open(local, 'rb')
IOError: [Errno 2] No such file or directory: 'Winter.jpg'
Gruß Hanman[/quote]
			 
			
					
				
				Verfasst: Samstag 31. Juli 2004, 12:28
				von hans
				Hi Hanman
gib doch mal bitte etwas Code mit, sonst können wir nur ein Ratespiel veranstalten.
Hans
			 
			
					
				
				Verfasst: Samstag 31. Juli 2004, 12:38
				von Hanman
				So, das Problem habe ich gelöst. Leider kommt jetzt dieser Fehler :
Traceback (most recent call last):
  File "/home/w11865/.//web/public_html/cgi-bin/upload.py", line 33, in ?
    conn.storbinary('STOR %s' % serverf, o , 1024)
  File "/usr/lib/python2.2/ftplib.py", line 418, in storbinary
    buf = fp.read(blocksize)
IOError: [Errno 9] Bad file descriptor
Das ist der Code :
Code: Alles auswählen
if ending[1] == '.jpeg' or '.jpg' or '.png' :
    dict = 'pics/'
    list = os.listdir(dict)
    count = len(list)
    count = count + 1
    count = str(count)
    conn = ftplib.FTP('ftp-gateway.de','blah','blah')
    serverf = 'b'+str(count)+str(ending)
    serverf2 = count+'.pic'
    o = open(local, 'w'))
    conn.storbinary('STOR %s' % serverf, o , 1024)
    o.close()
 
			
					
				
				Verfasst: Samstag 31. Juli 2004, 13:54
				von Milan
				Hi. Das wundert mich auch nicht sonderlich 

 ... Du willst eine Datei auf dem Server speichern lassen (wohlgemerkt binär), die du lokal zum schreiben geöffnet hast (und das im ascii-mode). Du gibts also dem Server keine Daten sondern erwartest welche von ihm, logisch dass er sich beschwert. Die Datei muss schon im Modus "binäres lesen" geöffnet werden "rb".
mfg Milan
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 14:48
				von Hanman
				Danke Milan, der Fehler ist nun erstmal weg, doch Python scheint immer noch nicht auf den Rechner des Clients zuzugreifen sondern auf den Server. Ich bin da jetzt langsam am verzweifeln!
Gruß Hanman
			 
			
					
				
				Verfasst: Sonntag 1. August 2004, 18:41
				von Hanman
				Ich lasse das Script auf einem Linux Server laufen. Kann es sein das Probleme mit der Form des Pfades gibt. Momentan sieht diese wie folgt aus :
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Wasserlilien.jpg
Wenn ich eine Datei mit dem Pfadnamen erstellen gibt es keinen Fehler.
Ich habe noch ein Problem :
Wenn ich eine Input Form mit dem Typ "file" (es wird ein Dateiauswahlmenü geöffnet) erstelle und essen Inhalt per CGI auslese wird nur der Dateiname ausgelesen der pfad allerdings nicht!
Gruß Hanman
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 19:43
				von Dookie
				Hi Hanman,
hat Dein Formular auch den Richtigen enctype in form von
Code: Alles auswählen
<form action="uploadscript.py" enctype="multipart/form-data">
 
 
Gruß
Dookie
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 20:48
				von Milan
				Hi. Schau dir mal den 
Quelltext hier an, ich hab ihn vor langer Zeit geschrieben... Das Script funktioniert ausgezeichnet bei mir, wie du 
hier sehen kannst.
Ein wenig verworren ist mir nämlich noch, wie du das Script einsetzt, vielleicht findest du da was. Schreib danach mal, wenn du was findest.
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 21:42
				von Hanman
				Ich hab aus deinem Code einfach mal das os.sep übernommen. Allerdings konnte ich nirgends finden wo du die Datei des Clients öffnest!
Kann das Problem vielleicht mit meinem Router zusammenhängen!
Gruß Hanman
			 
			
					
				
				Verfasst: Sonntag 1. August 2004, 21:50
				von Dookie
				Hi Hanman,
Die Dateien des Klients kannst vom Server aus nicht öffnen, dafür ist das Clientprogramm (Browser) zuständig, Das schickt dann die Daten als Multipart an den Server.
Gruß
Dookie
			 
			
					
				
				Verfasst: Sonntag 1. August 2004, 21:59
				von Hanman
				Ich häng einfach nochmal den Python und HTML Code dran. Ich denke eignetlich das darin alles stimmen müsste :
HTML
Code: Alles auswählen
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Unbenanntes Dokument</title>
</head>
<body>
<form action="/cgi-bin/upload.py" method="get" enctype="multipart/form-data" name="form1">
  <p>
    <input type="file" name="file">
</p>
  <p>
    <input type="submit" name="Submit" value="Senden">
</p>
</form>
</body>
</html>
Upload :
Code: Alles auswählen
path = 'C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Wasserlilien.jpg'
repl = path.replace('\\', os.sep)
print path, repl, os.sep
conn.storbinary('STOR %s' % serverf2, open(repl, 'rb'))
Holt die Daten :
Ich denke mal das dann am letzten Code Stück was falsch ist. Ich habe es schon ohne .value probiert, das hat mich aber auch nicht viel weiter gebracht.
Gruß Hanman
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 22:12
				von genrich
				
Sieht für mich jetzt nicht falsch aus, aber versuch doch einfach mal mir "
print form" zu schauen, ob denn die Informationen da sind...
 
			
					
				
				Verfasst: Sonntag 1. August 2004, 22:20
				von Dookie
				hmm für mich schaut der Upload-Teil etwas seltsam aus.
da sollte doch ein 
Code: Alles auswählen
conn.storbinary('STOR %s' % serverf2, form["file"].file)
eher zum Erfolg führen.
Gruß
Dookie
 
			
					
				
				Verfasst: Montag 2. August 2004, 08:14
				von Hanman
				Wenn ich die Daten mit .file hole, wird nur ein None übertragen. Kann das an der HTML Form liegen?
Gruß Hanman
			 
			
					
				
				Verfasst: Montag 2. August 2004, 08:58
				von Milan
				Hi. Auf jeden Fall, Dateien müssen immer per POST übertragen werden.
			 
			
					
				
				Verfasst: Montag 2. August 2004, 10:33
				von Hanman
				Wenn ich das Python Script nun per Post aufrufe, wird es nicht ausgeführt, Mozilla will es immer runterladen!
Gruß Hanman
			 
			
					
				
				Verfasst: Montag 2. August 2004, 11:40
				von Hanman
				Das Script wird jetzt wie von Wunderhand ausgeführt, allerdings wird bei manchen Dateien einfch mal rein Request gesendet, bei anderen schon und wenn kommt immer ein Fehler.  Ich bin einfach mal so frei und poste den ganzen Quelltext + den Fehler :
Code: Alles auswählen
#!/usr/bin/python
import cgi
import ftplib
import os.path
import os
import cgitb
import PIL
cgitb.enable()
form = cgi.FieldStorage()
local = form["file"].value
local2 = form["file"].file
print "Content-Type : text/html"
print
print local2
#fsize = os.path.getsize(local)
#if fsize > 60000 :
    #print "Content-Type : text/html"
    #print
    #print 'The file is too big'
ending = os.path.splitext(local)
if ending[1] == '.jpeg' or '.jpg' or '.png' :
    dict = 'pics'
    list = os.listdir(dict)
    print list
    count = len(list)
    count = count + 1
    count = str(count)
    conn = ftplib.FTP('ftp-gateway.de','user','passwd')
    conn.cwd('/public_html/cgi-bin/pics/')
    serverf2 = count+'.pic'
    repl = path.replace('\\', os.sep)
    print '\n',form["file"].file
    conn.storbinary('STOR %s' % serverf2, open(local2, 'rb'))
    open(serverf2, 'r')
    local2.close()
else :
    print "Content-Type : text/html"
    print
    print 'JPEG and PNG only'
Und hier die Fehler :
Der kommt wenn ich local2 noch einmal in einen Sting Konvertiere (ist im Quelltext oben nicht drin) :
Traceback (most recent call last):
  File "/home/w11865/.//web/public_html/cgi-bin/upload.py", line 36, in ?
    conn.storbinary('STOR %s' % serverf2, open(local3, 'rb'))
IOError: [Errno 2] No such file or directory: "<open file '(fdopen)', mode 'w+b' at 0x82aa290>"
Der wenn ich einfach local2 nehme :
Traceback (most recent call last):
  File "/home/w11865/.//web/public_html/cgi-bin/upload.py", line 36, in ?
    conn.storbinary('STOR %s' % serverf2, open(local2, 'rb'))
TypeError: coercing to Unicode: need string or buffer, file found
Es tut mir wirklich leid das ich euch soviele Umstände bereite 

 Ich bin selber am Verzweifeln
Gruß Hanman
 
			
					
				
				Verfasst: Montag 2. August 2004, 11:59
				von Milan
				Hi. Ich schaus mir nachher mal an, mit dem vollem Quelltext ist das um ein vielfaches leichter. Eben hab ich gerade dein FTP-Passwort aus dem Script gelöscht !!! Sowas darfst du nicht ohne weiteres posten, wir können nicht garantieren wer das alles gesehen hat (in den 20 min zwar so gut wie keiner, aber man weiß nie).