我看到一些使用pycurl的例子,但無法確定這是否符合要求?一些例子會有所幫助。謝謝。如何使用python-tornado從HTML表單上載圖片?
回答
很簡單:
<form action="/file" methods="POST"><!--your code--></form>
在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)
,但不推薦,因爲所有上傳的數據在RAM中;最好的方法是使用nginx的loadup模塊,但這很複雜。
這是實現龍捲風上傳的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]
該文件內容的理解。
下面是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>
使用文件時 - 當然,這種形式具有enctype="multipart/form-data"
。
一個小小的評論:在python3.x中,您需要以寫入二進制模式打開文件。所以它會是:'output_file = open(「uploads /」+ final_filename,'wb')'這是由於python3中字符串(unicode)和字節字符串的不同處理。 [更多這裏](https://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string) – klaas 2018-01-10 13:21:30
前面的代碼返回錯誤的文件名和錯誤的編碼。 下面的代碼工作:
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()
我也陷入了麻煩與[「」]語法,不知道爲什麼訪問文件的屬性時,但我切換到點語法,並能讀取數據。我在一臺Windows機器上,所以我也不得不將'open(「static/public /」+ file_name,'w')'改爲'open(「static/public /」+ file_name,'wb')'。沒有'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.")
tornado.web.RequestHandler
有self.request.files
方法。 它的結果就像
{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...}
- 1. 將圖片上載到html
- 2. 新手:如何使用PHP和mySQL從表單上載圖像
- 3. 如何從網上下載圖片?
- 4. 使用Django下載圖像從HTML表單
- 5. html使用網址加載圖片
- 6. HTML表單使用PHP上載其他表單內容的PDF
- 7. 如何使用表單(HTML)
- 8. 從電腦加載圖片PHP/HTML
- 9. 你可以製作一個HTML表單,用PHP從手機上傳圖片嗎?
- 10. 如何使用Ruby下載圖片?
- 11. 如何使用Nutch下載圖片?
- 12. 如何從本地html文件下載圖片?
- 13. 嘗試從圖片url下載圖片,但獲取html代替
- 14. 如何在Android上使用multipart/form-data上傳圖片/圖片
- 15. 如何使用文件上傳和圖片上傳選項創建表單?
- 16. HTML表單輸入背景圖片
- 17. 圖片選取器的HTML表單
- 18. 如何下載圖片但不顯示圖片?使用Fresco
- 19. Spring Boot轉換(從jsp加載圖片)到(從html加載)
- 20. 從網頁下載圖片使用python
- 21. 從網站下載圖片使用Coldfusion
- 22. 如何使用HTML表單使用XML值更新html表格?
- 23. 如何在android上載圖片?
- 24. 如何在couchdb上載圖片?
- 25. 如何使用rest url上載elgg圖片?
- 26. 如何使用jquery從html加載div?
- 27. 如何添加簡單的圖片上傳到表單?
- 28. 如何使用wget從「wikimedia搜索結果」下載圖片?
- 29. 如何從網址加載圖片
- 30. Fancybox - 如何從網址加載圖片?
爲什麼dir()在這裏需要?我想上傳/../img/目錄下的文件 – gora 2012-08-11 07:23:32
@AirirdhaJana沒有必要,只能輸出數據到控制檯。 – 2012-08-12 06:27:15
@AniruddhaJana對不起,代碼是錯誤的。我修改了。 – 2012-08-12 06:39:46