2012-08-10 9 views
11

मैंने उदाहरण देखा जो pycurl का इस्तेमाल करते थे, लेकिन यह सुनिश्चित नहीं हो सका कि यह किस तरह से जाने का तरीका है? कुछ उदाहरण मदद करेंगे। धन्यवाद।एक HTML फॉर्म से पायथन-टॉरनाडो के साथ एक छवि को अपलोड करने के लिए कैसे?

उत्तर

16

यह सरल है:

<form action="/file" methods="POST"><!--your code--></form> 
अजगर में

:

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) 

लेकिन यह सिफारिश नहीं कर रहा है, क्योंकि सभी अपलोड किए गए डेटा रैम में लोड किया जाता है; सबसे अच्छा तरीका nginx लोडअप मॉड्यूल का उपयोग है, लेकिन यह जटिल है।

+0

यहां डीआईआर() आवश्यक क्यों है? मैं /../img/ निर्देशिका – gora

+0

@ अनिरुद्धजाना ​​में फ़ाइल अपलोड करना चाहता हूं, केवल कंसोल के लिए आउटपुट डेटा आवश्यक नहीं है। –

+0

@ अनिरुद्ध जना क्षमा करें, कोड त्रुटि है। मैंने संशोधित किया –

15

यहां demo application है जो टर्ननाडो अपलोड लागू करता है।

यहाँ सर्वर कोड है:

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() 

केवल एक चीज है, तो आप इस कोड, उस फ़ाइल self.request.files[<file_input_name>][0] में स्थित सामग्री से समझना होगा। सुनिश्चित हो, उस रूप enctype="multipart/form-data" है -

<!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> 

जब फाइलों के साथ काम:

यहाँ एचटीएमएल कोड है।

+0

एक छोटी टिप्पणी: python3.x में आपको फ़ाइल को बाइनरी मोड लिखने की आवश्यकता है। तो यह होगा: 'output_file = open (" अपलोड/"+ final_filename, 'wb') 'यह स्ट्रिंग्स (यूनिकोड) और पायथन स्ट्रिंग्स के विभिन्न हैंडलिंग के कारण है python3 में। [यहां और अधिक] (https://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string) – klaas

4

पिछला कोड खराब फ़ाइल नाम और गलत एन्कोडिंग लौटा दिया। के बाद कोड काम करता है:

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

मैं चल रहा था मुसीबत में जब [ ''] वाक्य रचना, यकीन नहीं क्यों के साथ फ़ाइलें गुण तक पहुँचता है, लेकिन मैं वाक्य रचना डॉट में स्विच करने और डेटा को पढ़ने में सक्षम था। मैं एक विंडोज़ मशीन पर हूं इसलिए मुझे 'ओपन ("स्टेटिक/पब्लिक /" + फाइल_नाम,' डब्ल्यू ')' टू 'ओपन ("स्टेटिक/पब्लिक /" + फाइल_नाम,' डब्ल्यूबी ')' को भी बदलना पड़ा। 'Wb' के बिना फाइल दूषित हो रही थीं।

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.RequestHandlerself.request.files विधि है। इसका परिणाम

{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...} 
संबंधित मुद्दे