Python fájlfeltöltés
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:ráadásul ugyanez a jelenség jelentkezik akkor is, ha http meghívással akarom átküldeni a fájlt: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!
■ 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>
"""
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()
előre is köszönöm!
Valami az xampp-vel lehet,
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?
Nincs 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!
Az állomány sérülése engem
Az szándékosan lett olyan,
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...
Hát nagyon kijöttem a
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?
érdekes...
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
Így viszont elég egyértelmű,
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.
juhééééééééééééééééééééé!!!
#!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!
No comment... :-)
Hasonlóképp érzek...
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" :)
Én kihagytam a keresésből az
É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?
világos!
http://www.python.org/download/
és itt az elsőt telepítettem föl: Python 2.7.3 Windows Installer
FastCGI
Köszönjük, tanulságos volt.