2012-08-10 11 views

Antwort

16

Es ist ganz einfach:

<form action="/file" methods="POST"><!--your code--></form> 

in Python:

class FileHandler(tornado.web.RequestHandler): 
    # get post data 
    file_body = self.request.files['filefieldname'][0]['body'] 
    img = Image.open(StringIO.StringIO(file_body)) 
    img.save("../img/", img.format) 

aber es nicht empfohlen wird, weil alle hochgeladenen Daten in den Arbeitsspeicher geladen wird; Der beste Weg ist die Verwendung von nginx loadup modul, aber das ist komplex.

+0

Warum ist dir() hier notwendig? Ich möchte die Datei in/../img/ Verzeichnis – gora

+0

hochladen @AniruddhaJana ist nicht notwendig, nur Daten zur Konsole ausgeben. –

+0

@AniruddhaJana Sorry, Code ist ein Fehler. ich veränderte. –

15

Hier ist demo application, die Tornado-Upload implementiert.

Hier Servercode ist:

import tornado.httpserver, tornado.ioloop, tornado.options, tornado.web, os.path, random, string 
from tornado.options import define, options 

define("port", default=8888, help="run on the given port", type=int) 

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", IndexHandler), 
      (r"/upload", UploadHandler) 
     ] 
     tornado.web.Application.__init__(self, handlers) 

class IndexHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("upload_form.html") 

class UploadHandler(tornado.web.RequestHandler): 
    def post(self): 
     file1 = self.request.files['file1'][0] 
     original_fname = file1['filename'] 
     extension = os.path.splitext(original_fname)[1] 
     fname = ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(6)) 
     final_filename= fname+extension 
     output_file = open("uploads/" + final_filename, 'w') 
     output_file.write(file1['body']) 
     self.finish("file" + final_filename + " is uploaded") 

def main(): 
    http_server = tornado.httpserver.HTTPServer(Application()) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 

if __name__ == "__main__": 
    main() 

Das einzige, was haben Sie von diesem Code zu verstehen, dass Dateiinhalt in self.request.files[<file_input_name>][0] befindet.

Hier Code html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<title>Tornado Upload Application</title> 
</head> 
<body> 
<p><h1>Tornado Upload App</h1></p> 
<form enctype="multipart/form-data" action="/upload" method="post"> 
File: <input type="file" name="file1" /> 
<br /> 
<br /> 
<input type="submit" value="upload" /> 
</form> 

Bei der Arbeit mit Dateien - sicher sein, dass Form hat enctype="multipart/form-data".

+0

Eine kleine Bemerkung: In Python3.x müssen Sie die Datei im binären Schreibmodus öffnen. So wird es sein: 'output_file = open (" uploads/"+ final_filename, 'wb')' Dies liegt an der unterschiedlichen Behandlung von Strings (Unicode) und Byte-Strings in python3. [mehr hier] (https://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string) – klaas

4

Der vorherige Code hat einen schlechten Dateinamen und eine falsche Codierung zurückgegeben. folgender Code funktioniert:

import tornado.httpserver, tornado.ioloop, tornado.options, tornado.web, os.path, random, string 




class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", IndexHandler), 
      (r"/upload", UploadHandler) 
     ] 
     tornado.web.Application.__init__(self, handlers) 

class IndexHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("tornadoUpload.html") 

class UploadHandler(tornado.web.RequestHandler): 
    def post(self): 
     file1 = self.request.files['file1'][0] 
     original_fname = file1['filename'] 

     output_file = open("uploads/" + original_fname, 'wb') 
     output_file.write(file1['body']) 

     self.finish("file " + original_fname + " is uploaded") 

settings = { 
'template_path': 'templates', 
'static_path': 'static', 
"xsrf_cookies": False 

} 
application = tornado.web.Application([ 
    (r"/", IndexHandler), 
      (r"/upload", UploadHandler) 


], debug=True,**settings) 



print "Server started." 
if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 
3

Ich war in Schwierigkeiten läuft, wenn die Dateien Eigenschaften mit der [ ‚‘] Syntax greift, nicht sicher, warum, aber ich wechselte Syntax zu Punkt und war in der Lage, die Daten zu lesen. Ich bin auf einem Windows-Rechner, also musste ich auch 'öffnen ("statisch/öffentlich /" + Dateiname,' w ')' zu "öffnen" ("statisch/öffentlich /" + Dateiname, 'wb') "ändern. Ohne das 'wb' wurden die Dateien beschädigt.

def uploadFile(self,input_name,file_type): 
      a_file = self.request.files[input_name][0] 
      extension = os.path.splitext(a_file.filename)[1] 

      if file_type is 'photo': 
       type_list = ['.png','.jpg','.jpeg','.gif'] 
      elif file_type is 'attachment': 
       type_list = ['.pdf','.doc','.docx','.xls'] 

      if extension in type_list: 
       file_name = ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(16)) 
       output_file = open("static/public/" + file_name + extension, 'wb') 
       output_file.write(a_file.body) 
       return (a_file.filename + " has been uploaded.") 
0

tornado.web.RequestHandler hat self.request.files Methode. ist das Ergebnis wie

{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...} 
Verwandte Themen