File-Upload Dateigröße prüfen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
dusselmann
User
Beiträge: 70
Registriert: Donnerstag 28. Juli 2005, 12:47
Kontaktdaten:

Hi,

wie kann ich nach einem Fileupload die Dateigröße prüfen? Ich möchte z.B. nur Dateigrößen von 100kb zulassen.. Muss ich das File erst auf der HD zwischenspeichern, um die Größe abzuprüfen oder geht das auch in der ZODB direkt?

Gruß, Dussel
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dusselmann hat geschrieben: wie kann ich nach einem Fileupload die Dateigröße prüfen?
Hi Dussel!

Du nimmst vor dem Speichern des "file"-Objektes dieses "file"-Objekt irgendwie entgegen. Bevor du es speicherst, könntest du mit len() die Größe des "file"-Objektes abfragen.

Nachdem das Objekt gespeichert wurde kommst du meistens mit "getSize()" an die Größe ran.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
dusselmann
User
Beiträge: 70
Registriert: Donnerstag 28. Juli 2005, 12:47
Kontaktdaten:

Danke dir! :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Kann man nicht direkt an den os.environ["CONTENT_LENGTH"] gehen???

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:Kann man nicht direkt an den os.environ["CONTENT_LENGTH"] gehen???
Hi Jens!

Kann sein, glaube ich aber nicht, da das eher zu CGI passt.

lg
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:

Hm! Willst du damit sagen, das man in Zope nicht an die vom Browser geschickten Header ran kommt?

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:Hm! Willst du damit sagen, das man in Zope nicht an die vom Browser geschickten Header ran kommt?
Hi Jens!

Nein, so meinte ich das natürlich nicht. :lol: Das wäre ja schlimm, wenn man nicht an den REQUEST des Browsers ran kommen würde.

Hier ein Beispiel, eines Aufrufes, des bearbeitenden Skriptes und des Ergebnisses:

Aufrufende Seite:

Code: Alles auswählen

<html>
<body>

  <form enctype="multipart/form-data" 
        method="post"
        action="empfangendes_skript" 
        name="frm_main"
  >
    <p>
      Vorname: <input name="vorname"><br />
      Nachname: <input name="nachname"><br />
      Bild: <input name="picture" type="file">
    </p>
    <p>
      <button type="submit" name="ok">OK</button>
    </p>
  </form>
  
</body>
</html>
Verarbeitendes Skript:

Code: Alles auswählen

request = context.REQUEST
return request
Ergebnis als HTML (bitte Ergebnis in eine HTML-Datei speichern und mit dem Browser ansehen):

Code: Alles auswählen

<h3>form</h3>
<table>
<tr valign="top" align="left">
<th>nachname</th>
<td>'asf'</td>
</tr>
<tr valign="top" align="left">
<th>picture</th>
<td><ZPublisher.HTTPRequest.FileUpload instance at
0x4368366c></td>
</tr>
<tr valign="top" align="left">
<th>vorname</th>
<td>'asdf'</td>
</tr>
<tr valign="top" align="left">
<th>ok</th>
<td>''</td>
</tr>
</table>
<h3>cookies</h3>
<table>
<tr valign="top" align="left">
<th>AnonymousVoted26c5ac8ab38a349005e26ed0e33aa21a</th>
<td>'6'</td>
</tr>
<tr valign="top" align="left">
<th>tutorialExamplesURL</th>
<td>'http://gps.gp:8380/TESTORDNER/myTutorial/examples'</td>
</tr>
<tr valign="top" align="left">
<th>tree-s</th>
<td>'eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuxEQ9AIOOB9Q'</td>
</tr>
<tr valign="top" align="left">
<th>dtpref_cols</th>
<td>'90%'</td>
</tr>
<tr valign="top" align="left">
<th>__ac_name</th>
<td>'gerold'</td>
</tr>
<tr valign="top" align="left">
<th>dtpref_rows</th>
<td>'15'</td>
</tr>
</table>
<h3>lazy items</h3>
<table>
<tr valign="top" align="left">
<th>SESSION</th>
<td><bound method SessionDataManager.getSessionData of
<SessionDataManager at /session_data_manager>></td>
</tr>
</table>
<h3>other</h3>
<table>
<tr valign="top" align="left">
<th>TraversalRequestNameStack</th>
<td>[]</td>
</tr>
<tr valign="top" align="left">
<th>AUTHENTICATED_USER</th>
<td>gerold</td>
</tr>
<tr valign="top" align="left">
<th>URL</th>
<td>'http://gps.gp:8380/TESTORDNER/empfangendes_skript'</td>
</tr>
<tr valign="top" align="left">
<th>SERVER_URL</th>
<td>'http://gps.gp:8380'</td>
</tr>
<tr valign="top" align="left">
<th>AUTHENTICATION_PATH</th>
<td>''</td>
</tr>
<tr valign="top" align="left">
<th>traverse_subpath</th>
<td>[]</td>
</tr>
<tr valign="top" align="left">
<th>PUBLISHED</th>
<td><PythonScript at /TESTORDNER/empfangendes_skript></td>
</tr>
<tr valign="top" align="left">
<th>ACTUAL_URL</th>
<td>'http://gps.gp:8380/TESTORDNER/empfangendes_skript'</td>
</tr>
<tr valign="top" align="left">
<th>URL0</th>
<td>http://gps.gp:8380/TESTORDNER/empfangendes_skript</td>
</tr>
<tr valign="top" align="left">
<th>URL1</th>
<td>http://gps.gp:8380/TESTORDNER</td>
</tr>
<tr valign="top" align="left">
<th>URL2</th>
<td>http://gps.gp:8380</td>
</tr>
<tr valign="top" align="left">
<th>BASE0</th>
<td>http://gps.gp:8380</td>
</tr>
<tr valign="top" align="left">
<th>BASE1</th>
<td>http://gps.gp:8380</td>
</tr>
<tr valign="top" align="left">
<th>BASE2</th>
<td>http://gps.gp:8380/TESTORDNER</td>
</tr>
<tr valign="top" align="left">
<th>BASE3</th>
<td>http://gps.gp:8380/TESTORDNER/empfangendes_skript</td>
</tr>
</table>
<h3>environ</h3>
<table>
<tr valign="top" align="left">
<th>HTTP_COOKIE</th>
<td>'__ac_name="gerold";
AnonymousVoted26c5ac8ab38a349005e26ed0e33aa21a="6";
dtpref_cols="90%"; dtpref_rows="15";
tutorialExamplesURL="http://gps.gp:8380/TESTORDNER/myTutorial/examples";
tree-s="eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuxEQ9AIOOB9Q"'</td>
</tr>
<tr valign="top" align="left">
<th>SERVER_SOFTWARE</th>
<td>'Zope/(Zope 2.8.3-final, python 2.3.5, linux2) ZServer/1.1
Plone/Unknown'</td>
</tr>
<tr valign="top" align="left">
<th>SCRIPT_NAME</th>
<td>''</td>
</tr>
<tr valign="top" align="left">
<th>REQUEST_METHOD</th>
<td>'POST'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_KEEP_ALIVE</th>
<td>'300'</td>
</tr>
<tr valign="top" align="left">
<th>SERVER_PROTOCOL</th>
<td>'HTTP/1.1'</td>
</tr>
<tr valign="top" align="left">
<th>channel.creation_time</th>
<td>1134149754</td>
</tr>
<tr valign="top" align="left">
<th>CONNECTION_TYPE</th>
<td>'keep-alive'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_ACCEPT_CHARSET</th>
<td>'ISO-8859-15,utf-8;q=0.7,*;q=0.7'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_USER_AGENT</th>
<td>'Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8) Gecko/20051201
Firefox/1.5'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_REFERER</th>
<td>'http://gps.gp:8380/TESTORDNER/aufrufende_seite'</td>
</tr>
<tr valign="top" align="left">
<th>SERVER_NAME</th>
<td>'0.0.0.0'</td>
</tr>
<tr valign="top" align="left">
<th>REMOTE_ADDR</th>
<td>'192.168.11.5'</td>
</tr>
<tr valign="top" align="left">
<th>PATH_TRANSLATED</th>
<td>'/TESTORDNER/empfangendes_skript'</td>
</tr>
<tr valign="top" align="left">
<th>SERVER_PORT</th>
<td>'8380'</td>
</tr>
<tr valign="top" align="left">
<th>CONTENT_LENGTH</th>
<td>'123055'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_HOST</th>
<td>'gps.gp:8380'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_ACCEPT</th>
<td>
'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'</td>
</tr>
<tr valign="top" align="left">
<th>GATEWAY_INTERFACE</th>
<td>'CGI/1.1'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_ACCEPT_LANGUAGE</th>
<td>'de-at,de;q=0.8,en-us;q=0.5,en;q=0.3'</td>
</tr>
<tr valign="top" align="left">
<th>CONTENT_TYPE</th>
<td>'multipart/form-data;
boundary=---------------------------19162679010591482471812035653'</td>
</tr>
<tr valign="top" align="left">
<th>HTTP_ACCEPT_ENCODING</th>
<td>'gzip,deflate'</td>
</tr>
<tr valign="top" align="left">
<th>PATH_INFO</th>
<td>'/TESTORDNER/empfangendes_skript'</td>
</tr>
</table>
Wie man sieht, bekommt man schon ein paar Informationen. Weiters kann man auch ablesen, dass man ein File-Objekt für das Bild zurück bekommt. Dieses kann man wie üblich mit ``read()`` auslesen und dann die Größe mit ``len()`` ermitteln. Man sollte, bevor man das File weiterverarbeitet, aber nicht vergessen, mit ``seek(0)`` wieder an den Anfang des Files zu gehen.

lg
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:

Aber da sehe ich doch auch was von CONTENT_LENGTH... Könnte man das nicht direkt herranziehen???

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:Aber da sehe ich doch auch was von CONTENT_LENGTH... Könnte man das nicht direkt herranziehen???
Hi Jens!

Ich weiß es nicht genau und habe es nicht überprüft, denke aber, dass ich mit folgender Aussage richtig liege.

CONTENT_LENGTH bezieht sich auf die Summe aller Daten die an den Server geschickt wurden. Was aber tun, wenn du im Formular zwei oder mehr Dateien mitschickst? Auch wenn du nur eine Datei an den Server schickst -- es werden auch alle anderen übermittelten Daten mitgezählt, es ist also nur ein Annäherungswert.

lg
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:

Ich glaube da hast du recht... Ist die summe aller POST Daten, IMHO...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Logdog82
User
Beiträge: 5
Registriert: Freitag 23. Dezember 2005, 18:58

Hallo,
also ich hab das jetzt auch mal versucht. Aber irgendwie klappt das bei mir nicht.
Ich lese die Datei so aus (das input feld heisst "datei" im HTML form):

Code: Alles auswählen

formular = context.REQUEST.form
datei = formular["datei"]
datei = datei.read()
return datei.len()
Als Fehler wird jedoch
An error was encountered while publishing this resource.

Error Type: AttributeError
Error Value: 'str' object has no attribute 'getSize'
zurück geliefert. Könntet ihr mir da vielleicht behilflich sein?
Danke schon mal.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Logdog82 hat geschrieben:
Error Value: 'str' object has no attribute 'getSize'
zurück geliefert. Könntet ihr mir da vielleicht behilflich sein?
Hi Logdog82!

Netter Avatar :-)

Mach doch mal aus ``datei.len() `` ``len(datei)``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Logdog82
User
Beiträge: 5
Registriert: Freitag 23. Dezember 2005, 18:58

:oops:
hehe danke
:oops: :oops:
ist mir das peinlich. Ok das hat geklappt. uuuups. Super danke dir.
Sind das Bytes die zurück kommen oder?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Logdog82 hat geschrieben::oops:
hehe danke
:oops: :oops:
ist mir das peinlich. Ok das hat geklappt. uuuups. Super danke dir.
Sind das Bytes die zurück kommen oder?
Die Anzahl der Zeichen. Wenn das vom Typ str ist, was es auch ist, ist dies equivalent zur byte anzahl.
TUFKAB – the user formerly known as blackbird
Antworten