upload-script funktioniert unter windows nicht richtig

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
recrov
User
Beiträge: 4
Registriert: Dienstag 6. März 2007, 16:38

liebe leute, ich hab ein rießen problem mit einem skript.
ich hab schon gegooglet und selbst überlegt, aber ich komm einfach nicht dahinter wie ich folgendes lösen soll:
ich hab ein upload-script aus dem netz übernommen mit dessen hilfe man dateien auf nen server hochladen kann.
das funktioniert problemlos solang man linux verwenden, aber unter windows wird die datei dann nicht unter dem eigentlichen dateinamen abgespeichert sondern unter dem vollständigen pfad von dem aus die datei hochgeladen wird.
ich vermute es hängt mit backslash zusammen - eine lösung hab ich leider aber nicht gefunden.
vielleicht fällt euch was ein?
hier der original-code:

Code: Alles auswählen

upload_dir = upload_dir +'/'+ benutzer
    if not os.path.exists(upload_dir):
	os.mkdir(upload_dir)
    if not fileitem.file: return
    fname = os.path.basename(fileitem.filename)
    fout = file (os.path.join(upload_dir, fname), 'wb')
    while 1:
        chunk = fileitem.file.read(100000)
        if not chunk: break
        fout.write (chunk)
    fout.close()
[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Kann es sein, das du den IE nimmst? Der sendet IMHO den vollen pfad...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
recrov
User
Beiträge: 4
Registriert: Dienstag 6. März 2007, 16:38

Hi. also ICH verwende firefox und linux, allerdings verwenden andere die das skript benutzen (wollen) unglücklicherweise windows und IE (zum teil wenigstens)... ärgerlich aber wahr ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

recrov hat geschrieben:

Code: Alles auswählen

upload_dir = upload_dir +'/'+ benutzer
    if not os.path.exists(upload_dir):
	os.mkdir(upload_dir)
    if not fileitem.file: return
    fname = os.path.basename(fileitem.filename)
    fout = file (os.path.join(upload_dir, fname), 'wb')
    while 1:
        chunk = fileitem.file.read(100000)
        if not chunk: break
        fout.write (chunk)
    fout.close()
Hi recrov!

Willkommen im Python-Forum!

Vielleich genügt es ja schon, wenn du die Zeile 6 so umschreibst:

Code: Alles auswählen

    fname = os.path.basename(os.path.abspath(fileitem.filename))
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
recrov
User
Beiträge: 4
Registriert: Dienstag 6. März 2007, 16:38

hi gerald! na leider - das hab ich schon versucht ^^
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

recrov hat geschrieben:das hab ich schon versucht
Hi recrov!

Probier es noch einmal. Und lass im Programm den Wert von ``fileitem.filename`` ausgeben.

Hier die Erklärung:

Code: Alles auswählen

import os
>>> filename = "hallo.txt"
>>> os.path.abspath(filename)
'c:\\hallo.txt'
>>> os.path.basename(os.path.abspath(filename))
'hallo.txt'
>>> filename = "C:\\ordner1\\ordner2\\hallo.txt"
>>> os.path.abspath(filename)
'C:\\ordner1\\ordner2\\hallo.txt'
>>> os.path.basename(os.path.abspath(filename))
'hallo.txt'
>>> 
Sonst kann nur noch der ``upload_dir`` falsch sein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi recrov!

Mir ist eben beim Duschen eingefallen, was noch der Grund für dein Problem sein kann. :idea:

Wenn du mit os.path.abspath() einen Windows-Pfad unter Linux behandelst, dann bekommst du so etwas zurück: ``/root/C:\\asdf\asdf\asdf.txt``. Wenn du diesen Pfad dann mit os.path.basename() behandelst, dann bekommst du wahrscheinlich nur den ursprünglichen Windows-Pfad zurück und nicht den Dateinamen.

Lösung: Du musst dir selber eine Funktion schreiben, die dir den Dateinamen heraus filtert. Du darfst in diesem Fall nicht davon ausgehen, das os.path.basename dir den richtigen Dateinamen zurück gibt.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 6. März 2007, 23:05, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...so z.B.:

Code: Alles auswählen

new_filename = ""
for char in "C:\\asdf\\ddddd.txt"[::-1]:
    if char in ("\\/"):
        break
    new_filename += char
new_filename = new_filename[::-1]
mfg
Gerold
:-)

Edit: Jetzt funktioniert es auch mit Python 2.3
Zuletzt geändert von gerold am Mittwoch 7. März 2007, 11:24, insgesamt 3-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dafür gibts ja verschiedene path libs:

Code: Alles auswählen

r>>> import ntpath
>>> from os import path
>>> path.join("/my/new/folder", ntpath.basename(r"C:\Programme\Foobar\foobar.exe"))
'/my/new/folder/foobar.exe'
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

blackbird hat geschrieben:

Code: Alles auswählen

>>> import ntpath
Hi blackbird!

An ntpath habe ich nicht gedacht. Jetzt stellt sich nur die Frage, ob es sicher ist, dass nur von Windows-Computern aus der vollständige Pfad übertragen wird, oder ob es auch bei anderen Plattformen mit anderen Browsern der Fall ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mal ein Schuss ins blaue: Wie wäre es, wenn man erst ein normpath und danach ein basename macht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:Mal ein Schuss ins blaue: Wie wäre es, wenn man erst ein normpath und danach ein basename macht?
Hi Jens!

Ich habe mir schon einmal den Quellcode von ``os.path.abspath`` angesehen. Da wird bereits ``os.path.normpath`` aufgerufen. Das wird also ziemlich sicher nichts bringen.

Aber was habt ihr eigentlich gegen die kleine Lösung mit ``for char in ...``? Die ist schön schlank und funktioniert sicher.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

gerold hat geschrieben:An ntpath habe ich nicht gedacht. Jetzt stellt sich nur die Frage, ob es sicher ist, dass nur von Windows-Computern aus der vollständige Pfad übertragen wird, oder ob es auch bei anderen Plattformen mit anderen Browsern der Fall ist.
Das ist einfach nur ein IE 6 Bug. Diverse WSGI Adapter behandeln diesen Fehler schon im Backend (django, colubrid etc).
TUFKAB – the user formerly known as blackbird
recrov
User
Beiträge: 4
Registriert: Dienstag 6. März 2007, 16:38

ohoo.. wow! gleich so viele freundlich antworten! also danke mal herzlichst an alle :)
im übrigen: spezieller dank an gerald! hat mit for char in funktioniert!
problem also gelöst!
Antworten