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:

Upload

Beitragvon Hanman » Dienstag 27. Juli 2004, 12:24

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'
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 27. Juli 2004, 12:53

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: Alles auswählen

#!/usr/bin/env python
import this
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

Beitragvon Hanman » Samstag 31. Juli 2004, 11:59

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'
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Samstag 31. Juli 2004, 12:28

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:

Beitragvon Hanman » Samstag 31. Juli 2004, 12:38

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

Beitragvon Milan » Samstag 31. Juli 2004, 13:54

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:

Beitragvon Hanman » Sonntag 1. August 2004, 14:48

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:

Beitragvon Hanman » Sonntag 1. August 2004, 18:41

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'
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 1. August 2004, 19:43

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: Alles auswählen

#!/usr/bin/env python
import this
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Sonntag 1. August 2004, 20:48

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:

Beitragvon Hanman » Sonntag 1. August 2004, 21:42

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'
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 1. August 2004, 21:50

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: Alles auswählen

#!/usr/bin/env python
import this
Hanman
User
Beiträge: 48
Registriert: Mittwoch 31. März 2004, 12:24
Kontaktdaten:

Beitragvon Hanman » Sonntag 1. August 2004, 21:59

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

Beitragvon genrich » Sonntag 1. August 2004, 22:12

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...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 1. August 2004, 22:20

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: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder