ugrás a tartalomhoz

Python fájlfeltöltés

DarkRaptor · 2012. Okt. 21. (V), 09.50
Sziasztok!

Most kezdtem bele a pythonba és már bele is ütköztem egy problémába, amin már hetek óta nem tudok továbblépni, a guglit is végigkattintgattam már. A jelenség az, hogy ha feltöltök egy fájlt, legyen az kép, vagy csak sima fájl, akkor a feltöltés után csak a puffer tartalma megy át, ergo a 120 kbyte-os képet 12 kbyte-al tölti föl, de ez a 12 kbyte változó, hol több, hol kevesebb. Íme a szkript:

#!C:\Python27\python.exe
# -*- coding: utf-8 -*-

import os
import sys
import cgi
import cgitb; cgitb.enable()


form = cgi.FieldStorage()

upload_dir = "upload/"
item = "file1"
 
errormsg = ""
 
         
def fbuffer(f, chunk_size=10000):
   while True:
      chunk = f.read(chunk_size)
      if not chunk: break
      yield chunk
  
if form.has_key(item):
     
   try: # Windows needs stdio set for binary mode.
      import msvcrt
      msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
      msvcrt.setmode (1, os.O_BINARY) # stdout = 1
   except ImportError:
      pass
  
   # A nested FieldStorage instance holds the file
   fileitem = form[item]
  
   # Test if the file was uploaded
   if fileitem.filename:
  
      # strip leading path from file name to avoid directory traversal attacks
      fname = os.path.basename(fileitem.filename)
      # build absolute path to files directory

      f = open(os.path.join(upload_dir, fname), 'wb', 10000)
  
      # Read the file in chunks
      for chunk in fbuffer(fileitem.file):
         f.write(chunk)
      f.close()
      
      message = 'The file "%s" was uploaded successfully' % fname
  
   else:
      message = 'No file was uploaded'                      
 
else:
   errormsg = "Nincs ilyen nevű file input mező!"
                         

print "Content-type: text/html; charset=utf-8;"

print """
<html>
<head><title>Sample</title></head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta HTTP-EQUIV="Content-Language" content="hu">
  
<body>
<form enctype="multipart/form-data" method="post" action="upload.py">
file: <input name="file1" type="file"><br><br>
<input type="submit" name="mehet" value="ok">
</form>
"""
 
print "<p>feltöltve: " + errormsg + "</p>"
 
print """
</body>
</html>
"""
ráadásul ugyanez a jelenség jelentkezik akkor is, ha http meghívással akarom átküldeni a fájlt:

import urllib2, cookielib
 
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
                                MultipartPostHandler.MultipartPostHandler)
params = { "username" : "bob", "password" : "riviera",
           "file1" : open("upload/fenykep.jpg", "rb") }
opener.open("http://localhost/cgi-bin/python/upload2.py", params)
 
...

upload2.py tartalma:
 
if form.has_key("file1"):
     
    d = form.getvalue("file1")
    fileObj = open("upload/test.jpg","w")
    fileObj.write(d)
    fileObj.close()
ui.: ha esetleg segítség, nem használok keretrendszert, az XAMPP cgi-bin/python mappában található az upload.py fájl

előre is köszönöm!
 
1

Valami az xampp-vel lehet,

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 12.22
Valami az xampp-vel lehet, mert linuxon simán működik az első script is.
Azt megnézted már, hogy mi kerül a feltöltött fájlba?
Nem valami hibaüzenetféleség?
(ezt pl. nagyon utálom a windows-ban: ha meg akarom nézni egy állomány belsejét, akkor fel kell varázsolni valami programot, míg linuxon egy od-vel el lehet intézni)

---------------
Most nézem, az XAMPP-nek nem része a python. Nem lehet, hogy a pythont nem találja a szervered? Apache error.log-ban nem ír valamit erről?
2

Nincs hiba

DarkRaptor · 2012. Okt. 21. (V), 13.30
Megnéztem az apache logokat, semmi hiba.

Összehasonlítottam a feltöltött fájlt az eredetivel és vannak hasonlóságok, szóval nem hiszem, hogy hibaüzenetet írna bele. Bele tudnál nézni a mentett kép forrásába? ide felraktam zipbe az eredeti képet és a feltöltöttet:



nagyon köszi!
3

Az állomány sérülése engem

kuka · 2012. Okt. 21. (V), 13.46
Az állomány sérülése engem arra emlékeztet amikor nem binárisan lett kezelve az adat. Ez volna az erre vonatozó rész, de nem tudhassuk a sikerét, mert a hibát egyszerűen lesajnálja:
   try: # Windows needs stdio set for binary mode.
      import msvcrt
      msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
      msvcrt.setmode (1, os.O_BINARY) # stdout = 1
   except ImportError:
#      pass # ehelyett
      sys.exit('Ez baj! Biztos van msvcrt modulunk?') # inkább ezt
5

Az szándékosan lett olyan,

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 14.10
Az szándékosan lett olyan, mert az msvcrt csak windows-on létezik (ott úgy tudom, kötelezően), más op.rendszereken viszont nincs ilyen.
Sajnos egy rossz szokás pythonos körökben (ahogy a tutorialokat nézegettem), hogy típus ellenőrzést, importálhatóságot így ellenőriznek...
(egyébként a kód valami tutorialból származik, ha jól sejtem)

Mellesleg lehet valami abban, amit írsz, de az izgalmas, hogy miért nem képes importálni azt a modult...
4

Hát nagyon kijöttem a

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 14.06
Hát nagyon kijöttem a gyakorlatból, mert szinte semmit sem találok. Mintha egy szabványos jpeg header lenne a rövid fájl eleje, de hiányozna belőle a kép.

Csak tippelek: talán valami biztonsági szoftver szól bele az életedbe? Sajnos most nincs olyan windows-om, amin kipróbálhatnám ezt az egészet, mindenesetre érdekes: nem szemét kerül bele, hanem a feltöltött fájl egyes részei... (????)
Mi van, ha egy hosszú szövegfájllal próbálkozol? Azt is szétszabdalja?
6

érdekes...

DarkRaptor · 2012. Okt. 21. (V), 14.23
Létrehoztam egy 3MB-os TXT fájlt lorem ipsum szövegekkel, az elejét "eleje" szöveggel, a végét pedig "vége" szöveggel lezártam és jé, nem szabdalja szét DE a fájl mérete nem ugyanaz, a feltöltött fájlé 10kbyte-al kisebb, valamit kispórol belőle, de legalább a tartalmát nem szedi szét :D kipróbáltam egy PDF-et is, ugyanúgy szétszedi, mint a képet.

Az msvcrt modult betölti, mert ha a fejlécbe rakom, nem ír ki hibát és amúgy is az import beírása után felkínálja a listában, szóval létező modul a python mappában.

Azért ez lál :D ha rájöttök, vendégeim lesztek egy sörre! :D
7

Így viszont elég egyértelmű,

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 15.00
Így viszont elég egyértelmű, hogy valamiért mégsem binárisan tölti fel a fájlokat.
Az a hiányzó pár KB ebből következhet.

Hmmmmmm... No várj egy kicsit, kipróbálom, hogy mit művel, ha windows-ról töltök fel valamit!

update: kipróbáltam, nálam így is működik. Sajnos a windows-on futó apache-hoz nagyon nem értek.
8

juhééééééééééééééééééééé!!!

DarkRaptor · 2012. Okt. 21. (V), 15.23
egy orosz oldalon megleltem a megoldást :D hogy a többiek is okuljanak, ennyi az egész és már működik is:

#!C:\Python27\python.exe

helyett

#!C:\Python27\python.exe -u

az msvcrt-s modul csak akkor működik, ha ott van a -u is :D

nagyon köszi!
9

No comment... :-)

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 15.27
Tudnék rá írni valamit, de hagyjuk a flame-et! :-D
11

Hasonlóképp érzek...

DarkRaptor · 2012. Okt. 21. (V), 15.30
hetek óta szenvedtem már ezzel, szal igen, no comment! :D

nélkületek nem ment volna, az lendített előre, hogy rávilágítottatok az msvcrt-re, innen már gugli barátunk segített: "python msvcrt binary upload" :)
12

Én kihagytam a keresésből az

eddig bírtam szó nélkül · 2012. Okt. 21. (V), 15.36
Én kihagytam a keresésből az msvcrt-t, így csupa használhatatlan találatot kaptam.
És csatlakozom kukához: soha meg nem fordult volna a fejemben, hogy windows-on is használja valaki azt a bizonyos első sort...
(unix like rendszereken megvan a magyarázat rá és ott a shell mindig figyelembe veszi, de windows-on... ez új!)

----
Ha még emlékszel, hogy hol találtad, esetleg szólhatnál a szerzőjének is.
Egyébként milyen pythonod van? ActiveState? Vagy egyéb?
13

világos!

DarkRaptor · 2012. Okt. 21. (V), 16.20
Szerintem is fura, de a bizonyos első sor nélkül azonnal hibát dob. De ez lehet, hogy az XAMPP beállításaitól is függ. Ezt használom:

http://www.python.org/download/

és itt az elsőt telepítettem föl: Python 2.7.3 Windows Installer
14

FastCGI

janoszen · 2012. Okt. 21. (V), 22.40
Ha jól vettem észre, Te itt CGI scriptet próbálsz meg írni. Nem biztos, hogy változtat a helyzeten, de egy csomó szívástól és teljesítmény problémától meg fog kímélni, ha kicist megnézegeted a FastCGI-t.
10

Köszönjük, tanulságos volt.

kuka · 2012. Okt. 21. (V), 15.30
Köszönjük, tanulságos volt. (Nem hittem, hogy bárki is ránéz Windowson a shebangre.)