Ich sah Beispiele, die pycurl verwendeten, aber konnte nicht sicher sein, ob dies der Weg ist zu gehen? Einige Beispiele werden helfen. Vielen Dank.Wie lade ich ein Bild mit Python-Tornado aus einem HTML-Formular hoch?
Antwort
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.
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"
.
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
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()
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.")
tornado.web.RequestHandler
hat self.request.files
Methode. ist das Ergebnis wie
{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...}
- 1. Lade ein Bild mit Phonegap hoch: InvalidCastException
- 2. Expression Engine - Wie lade ich ein Bild mit SafeCracker hoch?
- 3. Wie lade ich ein Bild zu Parse in Android hoch?
- 4. Wie lade ich ein Bild in der Django-Webanwendung hoch?
- 5. Wie lade ich ein Bild in Schienen hoch?
- 6. Wie lade ich ein R-Paket hoch?
- 7. Wie lade ich ein Bild für ein Event mit der Facebook Graph API hoch?
- 8. "AJAX" Lade ein Bild in ein größeres Formular hoch
- 9. Wie lade ich ein Bild mit Javascript
- 10. Wie lade ich ein Bild hoch, indem ich die Parameter in der URL mit Swift übergebe?
- 11. Wie lade ich ein Bild mit Fabric.js auf eine Leinwand hoch?
- 12. Wie lade ich ein Bild aus dem Web in Java
- 13. Wie lade ich ein Bild mit Meteor auf meinen Server hoch?
- 14. Wie lade ich eine Datei zu einem WCF-Dienst hoch?
- 15. Wie lade ich ein Bild in Dart
- 16. Wie lade ich mehrere Dateien hoch
- 17. Wie lade ich ein fehlerfreies Python-Paket nach PyPI hoch?
- 18. Wie lade ich ein Bild mit Jasnys Bootstrap Image Preview hoch?
- 19. Wie lade ich ein großes Video in iOS hoch?
- 20. Wie lade ich eine Datei mit Phonegap und JqueryMobile hoch?
- 21. C# facebook graph/Wie lade ich ein Bild auf Facebook Album hoch?
- 22. Wie lade ich 3gp-Dateien hoch
- 23. Wie lade ich Dateien mit Ajax in Codeigniter hoch?
- 24. Wie lade ich ein Bild in Zugriffsformular
- 25. Wie lade ich ein Objekt in S3 in Lambda hoch?
- 26. Wie lade ich ein Video auf YouTube in Android hoch?
- 27. Wie lade ich eine Datei mit mod_python hoch?
- 28. Wie lade ich ein Bild in eine bestehende MySql-Datenbank hoch?
- 29. Wie lade ich ein Bild über den Webservice in node.js hoch?
- 30. imgur commerce - wie lade Bild ins Album hoch?
Warum ist dir() hier notwendig? Ich möchte die Datei in/../img/ Verzeichnis – gora
hochladen @AniruddhaJana ist nicht notwendig, nur Daten zur Konsole ausgeben. –
@AniruddhaJana Sorry, Code ist ein Fehler. ich veränderte. –