Tôi thấy các ví dụ sử dụng pycurl, nhưng không thể chắc chắn nếu đây là cách để đi với? Một số ví dụ sẽ giúp ích. Cảm ơn.Làm thế nào để tải lên một hình ảnh với python-tornado từ một hình thức HTML?
Trả lời
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.
Đâ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"
.
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
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()
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.")
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}],...}
- 1. Làm thế nào để tải lên hình ảnh với hình ảnh xem trước bootstrap của Jasny?
- 2. Làm thế nào để lưu trữ hình ảnh tải lên trong một phiên PHP?
- 3. Tải hình ảnh từ iOS lên PHP
- 4. tải hình ảnh từ android lên webservice
- 5. Làm thế nào để tải lên một tập tin/hình ảnh thông qua deliciouspie
- 6. Làm cách nào để định vị một hình ảnh trên một hình ảnh khác trong HTML?
- 7. Làm thế nào để đọc một hình ảnh với PHP?
- 8. Làm cách nào để xem trước hình ảnh đã tải lên làm hình nền của div?
- 9. Làm thế nào để vẽ một hình chữ nhật lên một hình ảnh với độ trong suốt và văn bản
- 10. html5 Tải lên hình ảnh
- 11. Làm thế nào để bạn tổng hợp một hình ảnh vào một hình ảnh khác với PIL trong Python?
- 12. API Tumblr - cách tải nhiều hình ảnh lên một Photoet
- 13. Null byte tiêm trong một hình thức tải lên
- 14. Làm cách nào để có thể phủ một hình ảnh lên hình ảnh khác?
- 15. Làm cách nào để chồng hình ảnh SVG lên một hình ảnh khác bằng Apache Batik?
- 16. HTML 5 Hình ảnh tải tệp làm hình nền
- 17. Làm cách nào để tải lên một tệp mới trên nút bấm hình ảnh
- 18. Làm thế nào để cắt một hình ảnh với một hình chữ nhật xoay?
- 19. WISiWYG với hình ảnh tải lên: Cách Django
- 20. Làm thế nào để cắt một hình ảnh trong vb.net?
- 21. Laravel 4 hình thức tải lên hình thức
- 22. Tải lên hình ảnh jQuery ajax
- 23. Làm thế nào để bật lên một số hình ảnh một phần trong android
- 24. làm thế nào để vượt qua một mảng để một kịch bản perl cgi với một hình thức HTML?
- 25. Làm thế nào để tải lên một hình ảnh (được đưa ra dưới dạng dữ liệu-URL từ HTML vải) để facebook?
- 26. Tải hình ảnh từ địa phương lên TinyMCE?
- 27. Làm thế nào để chuyển đổi hình ảnh sang html?
- 28. Django với jquery-tinymce tải lên hình ảnh plugin
- 29. Làm thế nào để tải hình ảnh lên máy chủ Php và lưu trữ trong phpmyadmin
- 30. Tải lên hình ảnh bằng Phonegap: InvalidCastException
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
@AniruddhaJana là không cần thiết, chỉ xuất dữ liệu ra bàn điều khiển. –
@AniruddhaJana xin lỗi, mã là lỗi. tôi đã sửa đổi. –