was bezweckst Du mit
Code: Alles auswählen
... os.sep in fileitem.filename
Ja, hatte ich damit vor. Ist aber anscheinend nicht nötig. Ich versuche noch herauszufinden wo das gemacht wird.BlackJack hat geschrieben:Zum `os.sep`: Ich denke veers möchte verhindern, dass Dateinamen mit Pfadtrennern gespeichert werden, weil die entweder in einem Unterverzeichnis landen würden, was es nicht gibt, oder aber ein böser Mensch mit so etwas wie '../../index.html' versucht irgendwelche Dateien der Website zu überschreiben.
Code: Alles auswählen
#!/usr/bin/python
import os, sys, time, glob, string
import md5
import cgi
import cgitb
cgitb.enable()
upload_path = os.environ['DOCUMENT_ROOT'] + 'uploads/'
cgi_tmp_file_name = 'cgi_data_tmp_'
message = ''
def readStdin(fnpath, fn, sid):
content_len = int(os.environ['CONTENT_LENGTH']) * 1.
t_start = time.time()
fstat = open(fnpath + "stats_" + sid + '.txt', 'w')
f = open(fnpath + fn + sid, 'w+')
b_read = 0
while True:
data = sys.stdin.read(1024*64) # read 64k at a time
if not data: break
f.write(data)
f.flush() # so the ajax poller gets an accurate reading
b_read += 1024*64
t_elapsed = time.time() - t_start
if t_elapsed >= 1:
b_estimate = b_read / t_elapsed; # in kb/sec
else:
b_estimate = b_read / .5;
b_percent = b_read / content_len * 100. # content_len in kb
if b_percent >= 99:
b_percent = 99
t_est = (content_len - b_read) / b_estimate # in sec
if t_est <= 0.:
t_est = 0.
b_est_percent = b_estimate / content_len * 100. # in percent kb
# % , % per second, kb estimate, est time remaining
fstat.seek(0,0)
fstat.write("%f\n%f\n%f\n%f\n%d\n\n" % (b_percent,b_est_percent,b_estimate,t_est,content_len))
fstat.flush()
time.sleep(0.35)
fstat.seek(0,0)
fstat.write("100.\n%f\n%f\n0.\n%d\n\n" % (b_est_percent,b_estimate,content_len))
fstat.flush()
fstat.close()
f.seek(0)
return f
def writeFileData(fnpath, fi):
# strip leading path from file name to avoid directory traversal attacks
fn = os.path.basename(fi.filename)
path_fn = fnpath + fn
fout_fn = open(path_fn, 'w')
while 1:
chunk = fi.file.read(4096)
if not chunk: break
fout_fn.write(chunk)
fout_fn.close()
if os.path.exists ( path_fn ):
oldumask = os.umask(0)
os.chmod( path_fn, 0755 )
os.umask( oldumask )
return
def killFiles(fnpath, fn, sid):
try:
os.remove(fnpath + fn + sid)
except:
pass
return
# #MAIN# #
# HTMLForm_fileupload.cgi?sid=val
try:
session_id = cgi.parse_qs(os.environ['QUERY_STRING'])['sid'][0]
except:
session_id = "nosid_nosid"
# read in data over stdin and write to a file as the file uploads
cgi_in = readStdin(upload_path, cgi_tmp_file_name, session_id)
form = cgi.FieldStorage(cgi_in)
cgi_in.close()
if form:
f = 0
if form.has_key('file[]'): # we have uploads.
for fileitem in form['file[]']:
if fileitem.file and fileitem.filename:
writeFileData(upload_path, fileitem)
f +=1
message += 'Datei %d uploaded %s<br>' % (f, str(fileitem.filename))
if f:
killFiles(upload_path, cgi_tmp_file_name, session_id)
else:
message = 'keine Datei angegeben'
else:
message = 'keine Dateifeld'
else:
message = "keine Formulardaten eingegangen"
print """\
Content-Type: text/html\n
<html><body>"""
print "<p>%s</p></body></html>" % (message,)
Code: Alles auswählen
def umleitung(dateistromstückchen):
zähle bits
return dateistromstückchen
form = cgi.FieldStorage(umleitungsys.stdin.read(1024))
Muss man aber, zumindest unter Windows, wo es einen Unterschied zwischen Text und Binärdateien gibt. Wenn du dort Binärdateien ohne das ``b`` Flag schreibst sind sie Schrott, weil die EOL-Zeichen platformspezifisch konvertiert werden.x-herbert hat geschrieben:Thema: Öffnen als Binärdateien - ich habe beides gefunden als w bzw. wb und keine eindeutige Aussage, dass man unbedingt wb nehmen muss...
Ich finde AJAX in sagen wir mal, Django besser als in Rails. Warum? Weil es nicht mitgeliefert ist und ich somit entscheiden kann, ob ich Prototype einsetzen will - will ich meist nicht, bevorzuge jQuery.x-herbert hat geschrieben:Da Python (meiner Meinung nach) gegenüber Ruby den Zug "AJAX" etwas verpasst hat, wäre hier die Gelegenheit ein Stück aufzuholen....
upps.... da reißt der Windschatten langsam ab - da habe ich keine Idee wie man dies realisiertGenau das mit der Umleitung hatte ich doch schon vorgeschlagen: Ein Datei-ähnliches Objekt, das mitzählt wieviel gelesen wurde.
Code: Alles auswählen
def read_multi(self, environ, keep_blank_values, strict_parsing):
"""Internal: read a part that is itself multipart."""
ib = self.innerboundary
if not valid_boundary(ib):
raise ValueError, 'Invalid boundary in multipart form: %r' % (ib,)
self.list = []
klass = self.FieldStorageClass or self.__class__
part = klass(self.fp, {}, ib,
environ, keep_blank_values, strict_parsing)
# Throw first part away
while not part.done:
headers = rfc822.Message(self.fp)
part = klass(self.fp, headers, ib,
environ, keep_blank_values, strict_parsing)
self.list.append(part)
self.skip_lines()
def read_single(self):
"""Internal: read an atomic part."""
if self.length >= 0:
self.read_binary()
self.skip_lines()
else:
self.read_lines()
self.file.seek(0)
bufsize = 8*1024 # I/O buffering size for copy to file
def read_binary(self):
"""Internal: read binary data."""
self.file = self.make_file('b')
todo = self.length
if todo >= 0:
while todo > 0:
data = self.fp.read(min(todo, self.bufsize))
if not data:
self.done = -1
break
self.file.write(data)
todo = todo - len(data)
...
def make_file(self, binary=None):
"""Overridable: return a readable & writable file.
...
"""
import tempfile
return tempfile.TemporaryFile("w+b")
Code: Alles auswählen
def main():
reader = None
try:
target = open(os.devnull, 'wb')
filename = 'P:\\record\\Ocean_11.mpg'
reader = MeasuringReader(open(filename, 'rb'),
os.path.getsize(filename))
monitor = TransferMonitor(reader)
monitor.start()
copyfileobj(reader, target)
target.close()
finally:
if reader:
reader.close()
blackbird hat seine Erfahrungen mit jQuery zusammengefasst und ich kann dem absolut zustimmen. Mit jQuery zu Arbeiten ist einfach grandios, damit bekommt man innerhalb kürzester Zeit tolle Dinge zusammen und das Chaining ist sehr nützlich.x-herbert hat geschrieben:Ich habe mir jQuery nochmal genauer angesehen - macht auch einen guten Eindruck... besser/schlechter ist hier wohl kaum die Frage, sondern auf welches "Pferd" man setzt und Erfahrungen sammelt - ODER gibt es von Dir noch USPs zu jQuery??