2012-08-10 20 views

Trả lời

16

Rất đơn giản:

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

bằng 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) 

nhưng nó không được khuyến khích, bởi vì tất cả dữ liệu đã tải được nạp trong bộ nhớ RAM; cách tốt nhất là sử dụng mô-đun tải nginx, nhưng điều này là phức tạp.

+0

tại sao dir() cần thiết ở đây? Tôi muốn tải tệp lên trong thư mục /../img/ – gora

+0

@AniruddhaJana là không cần thiết, chỉ xuất dữ liệu ra bàn điều khiển. –

+0

@AniruddhaJana xin lỗi, mã là lỗi. tôi đã sửa đổi. –

15

Đây là demo application thực hiện tải lên lốc xoáy.

Đây là mã máy chủ:

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

Điều duy nhất, bạn phải hiểu từ mã này, mà nội dung tập tin nằm trong self.request.files[<file_input_name>][0].

Đây là mã 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> 

Khi làm việc với các tập tin - chắc chắn, hình thức mà có enctype="multipart/form-data".

+0

Một nhận xét nhỏ: trong python3.x bạn cần phải mở tệp trong chế độ ghi nhị phân. Vì vậy, nó sẽ là: 'output_file = open (" uploads/"+ final_filename, 'wb')' Điều này là do xử lý khác nhau của chuỗi (unicode) và chuỗi byte trong python3. [thêm tại đây] (https://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string) – klaas

4

Mã trước trả về tên tệp sai và mã hóa sai. mã sau hoạt động:

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

tôi đã chạy vào rắc rối khi truy cập các tập tin thuộc tính với [ ''] cú pháp, không chắc chắn lý do tại sao, nhưng tôi chuyển sang chấm cú pháp và đã có thể đọc dữ liệu. Tôi đang trên một cửa sổ máy vì vậy tôi cũng đã phải thay đổi 'mở ("static/public /" + file_name,' w ')' để 'mở ("static/public /" + file_name,' wb ')'. Nếu không có 'wb' các tập tin đã bị hỏng.

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 có phương thức self.request.files. kết quả giống như

{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...} 
Các vấn đề liên quan