Fileupload: Datei wird abgeschnitten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

Hallo Leute,

ein kleines Problemchen zerrt an meinen Nerven:
Ich möchte eine Datei (meist Exel, Word etc.) hochladen

Hier ist der HTML Teil:

Code: Alles auswählen

   <form method="post" enctype="multipart/form-data" action="/~langertag/scripts/start.py">
      <input type="hidden" name="action" value="upload">
      <input type="hidden" name="path" value="<%out(path)%>">
      <input type="hidden" name="gruppe" value="<%out(gruppe)%>">
      
      Dateiname: <input type="file" name="uploadfile" size="64"><br />
      <input type="submit" value="upload">
   </form>
Der Pythoncode lautet:

Code: Alles auswählen

      fileitem = self.main.form['uploadfile']
      iFilename = fileitem.filename
      ext = os.path.splitext(iFilename)[1]
      ext = ext.lower()
      
      if not ext in self.PROPPER_EXT:
         self.main.flash = 'Ung&uuml;ltige Dateierweiterung "{0}". Die Datei muss einer der folgenden Erweiterungen haben {1}'.format(ext,', '.join(self.PROPPER_EXT))
         return


      oFileName = Config.mvcpath+'/root/informationen/gruppen/showgruppe/{0}{1}'.format(gruppe,ext)
      self.render(oFileName+'<br />')
      
      fOut = open(oFileName,'wb')
      fileitem.file.seek(0,os.SEEK_END)
      fSize = fileitem.file.tell()
      fileitem.file.seek(0)

      
      self.render ("Filename: %s name: %s mode: %s <br />" %(iFilename,fileitem.file.name,fileitem.file.mode))
      self.render ("Filesize: %d" % (fSize))

      fOut.write(fileitem.file.read())
      fOut.close()

      self.render('-- done --')

Es ist aber so, dass die Datei IMMER zu kurz ankommt.

Ausgabe:
upload../../WEB-INF/mvc/root/informationen/gruppen/showgruppe/AMS.xls
Filename: BUCHUNGSJOURNAL.xls name: c:\dokume~1\nagy\lokale~1\temp\tmpzcavzy mode: w+b
Filesize: 5911-- done --
Wenn ich wie empfohlen

Code: Alles auswählen

      msvcrt.setmode( 0, os.O_BINARY ) # stdin  = 0
      msvcrt.setmode( 1, os.O_BINARY ) # stdout = 1
Setze 'hängt' das System.

Interessant ist, dass bei der Überprüfung der Dateilänge schon zu wenig Bytes angezeigt werden.

Darf ich um Eure geschätzte Fachmeinung bitten...

Pyhton V2.6.5

Lg
\^/ili
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

``file.read(size)`` muss nicht unbedingt ``size`` Bytes lesen. Das können auch weniger sein. Das dürfte aber gar nicht das Problem sein.

Versuche das doch mal ohne Dateilängen-Rausfinden zu machen. Das sollte auch klappen, wenn du einfach solang die Input-Datei ließt, bis nix mehr übrig ist, ``read`` also einen leeren String returned.

Code: Alles auswählen

infile = ...
outfile = ...
while True:
  data = infile.read(8*1024)
  if not data:
    break
  outfile.write(data)
oder zum Beispiel auch so:

Code: Alles auswählen

infile = ...
outfile = ...
data = infile.read(8*1024)
while data:
  outfile.write(data)
  data = infile.read(8*1024)
PS: "Proper" hat nur ein "P".
Antworten