Vi ejemplos que utilizaban pycurl, pero no estaba seguro de si este era el camino a seguir. Algunos ejemplos ayudarán. Gracias.¿Cómo subir una imagen con python-tornado desde un formulario HTML?
Respuesta
Es muy sencillo:
<form action="/file" methods="POST"><!--your code--></form>
en 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)
pero no es recomendable, porque todos los datos cargado se carga en la memoria RAM; la mejor manera es utilizar el módulo de carga nginx, pero esto es complejo.
Aquí está demo application que implementa la carga tornado.
Aquí es el código del servidor:
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()
La única cosa, usted tiene que entender de este código, que el contenido del archivo situado en self.request.files[<file_input_name>][0]
.
Aquí es código 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>
Cuando se trabaja con archivos - por cierto, que tiene forma enctype="multipart/form-data"
.
Una pequeña observación: en python3.x necesita abrir el archivo en modo binario de escritura. Entonces será: 'output_file = open (" uploads/"+ final_filename, 'wb')' Esto se debe al manejo diferente de cadenas (unicode) y cadenas de bytes en python3. [más aquí] (https://stackoverflow.com/questions/6224052/what-is-the-difference-between-a-string-and-a-byte-string) – klaas
El código anterior devolvió un nombre de archivo incorrecto y una codificación incorrecta. siguiente código funciona:
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()
yo estaba corriendo en problemas cuando accede a los archivos de propiedades con el [ ''] sintaxis, sin saber por qué, pero cambió a Sintaxis con puntos y fue capaz de leer los datos. Estoy en una máquina de Windows, así que también tuve que cambiar 'open (' static/public/"+ file_name, 'w') 'to' open (" static/public/"+ file_name, 'wb') '. Sin el 'wb', los archivos se corrompían.
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
tiene self.request.files
método. es resultado como
{u'file': [{'body':FILEBODY, 'content_type':CONTENT_TYPE, 'filename': FILENAME}],...}
- 1. Cómo subir una imagen a Facebook
- 2. POST una matriz desde un formulario HTML sin javascript
- 3. ¿Cómo subir la documentación html generada desde sphinx a github?
- 4. Android twitter4j subir imagen
- 5. ¿Cómo subir una imagen (en forma de datos-URL del lienzo HTML) a Facebook?
- 6. jQuery imagen Subir - CodeIgniter
- 7. cómo subir una imagen capturada desde la cámara en una aplicación de Android
- 8. Crear dinámicamente un formulario HTML con Javascript
- 9. ¿Cómo subir un archivo (archivo adjunto) desde el navegador?
- 10. ¿Presentar un formulario HTML 5 con AJAX?
- 11. Envío de un formulario html con java
- 12. imagen Subir directamente al gorjeo
- 13. Cómo usar los valores del formulario desde un formulario independiente
- 14. Cómo llamar a la clase servlet desde el formulario HTML
- 15. ¿Cómo hacer un formulario HTML en gris?
- 16. ¿Cómo subir una carpeta con PHP?
- 17. ¿Cómo enviar de forma confiable un formulario HTML con JavaScript?
- 18. ¿Cómo subir un archivo en joomla?
- 19. Módulo Magento Subir imagen en Admin
- 20. ¿Cómo subir un archivo con JQueryMobile para un iphone/ipad?
- 21. Cómo subir Suds.WebFault desde el código python?
- 22. ¿Cerrar un formulario desde otro formulario?
- 23. Cómo agregar etiquetas HTML personalizadas con Zend Descripción del formulario
- 24. Mostrar PDF como formulario HTML
- 25. Arrastrar y soltar imagen en un formulario web
- 26. ¿Cómo eliminar xey en el formulario HTML con el botón Tipo de imagen?
- 27. cómo pasar una matriz a una secuencia de comandos perl cgi con un formulario HTML?
- 28. ASP.NET subir la imagen con cambio de tamaño
- 29. Guardar tabla HTML como imagen
- 30. Diseño de formulario HTML con CSS
¿por qué es dir() necesario aquí? Quiero cargar el archivo en /../img/ directorio – gora
@AniruddhaJana no es necesario, solo datos de salida a la consola. –
@AniruddhaJana lo siento, el código es un error. Yo modifiqué. –