Upload

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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
'Ich liebe es wenn ein Plan funktioniert'
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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 :

Code: Alles auswählen

conn.storbinary('STOR datei',open('datei','rb'),1024) 
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
[code]#!/usr/bin/env python
import this[/code]
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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]
'Ich liebe es wenn ein Plan funktioniert'
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Hi Hanman

gib doch mal bitte etwas Code mit, sonst können wir nur ein Ratespiel veranstalten.

Hans
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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()
'Ich liebe es wenn ein Plan funktioniert'
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Das wundert mich auch nicht sonderlich :wink: ... 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
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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
'Ich liebe es wenn ein Plan funktioniert'
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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
'Ich liebe es wenn ein Plan funktioniert'
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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
'Ich liebe es wenn ein Plan funktioniert'
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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 :

Code: Alles auswählen

form = cgi.FieldStorage()
local = form["file"].value
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
'Ich liebe es wenn ein Plan funktioniert'
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Hanman hat geschrieben:

Code: Alles auswählen

form = cgi.FieldStorage()
local = form["file"].value
Sieht für mich jetzt nicht falsch aus, aber versuch doch einfach mal mir "print form" zu schauen, ob denn die Informationen da sind...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

Wenn ich die Daten mit .file hole, wird nur ein None übertragen. Kann das an der HTML Form liegen?

Gruß Hanman
'Ich liebe es wenn ein Plan funktioniert'
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Auf jeden Fall, Dateien müssen immer per POST übertragen werden.
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

Wenn ich das Python Script nun per Post aufrufe, wird es nicht ausgeführt, Mozilla will es immer runterladen!

Gruß Hanman
'Ich liebe es wenn ein Plan funktioniert'
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

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
'Ich liebe es wenn ein Plan funktioniert'
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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).
Zuletzt geändert von Milan am Montag 2. August 2004, 12:46, insgesamt 1-mal geändert.
Antworten