我需要让用户在我的服务器上使用 Tornado 从 PhoneGap 应用程序上传图片,所以我使用了在另一个问题上找到的一段代码: 如何从 HTML 表单上传带有 python-tornado 的图像?
那里看到的代码工作得很好。但遗憾的是,我发送到服务器的并不是一个文件,而是一个 base64 编码的字符串。所以我在 UNIX 机器上建立了一个“测试实验室”,对代码进行了一些修改,所以我会收到字符串和另一个我需要在解码字符串后用来命名文件的 agrgument。当我启动该服务时,它会正常启动,但是当我尝试从浏览器访问它时,它会立即显示 500:内部服务器错误。我修改的代码的唯一部分是 UploadHandler,其他一切都完全相同。我对python很陌生,所以我知道我可能做错了什么。任何帮助,将不胜感激。
import tornado.httpserver, tornado.ioloop, tornado.web, os.path, random, string
from tornado.options import (define, options)
define("port", default=8884, help="run on the given port", type=int)
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/", IndexHandler),
(r"/upload", UploadHandler)
]
settings = {
'template_path': 'templates',
'static_path': 'static',
'xsrf_cookies': False
}
tornado.web.Application.__init__(self, handlers, **settings)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render("subir-string.html")
class UploadHandler(tornado.web.RequestHandler):
def post(self):
b64string = self.get_argument("imageData","")
v_id = self.get_argument("id","")
if b64string:
try:
new_name = "uploads/%s.jpg" % v_id
c = 0
while os.path.isfile(new_name):
base, ext = os.path.splitext(new_name)
new_name = "uploads/%s-%s%s" % (base, c, ext)
c= c + 1
output_file = open(new_name, 'w')
output_file.write(base64.decodestring(b64string))
except Exception as e:
print "Error: %s"%(e)
self.finish(" Can't process request")
else:
self.finish(" File Uploaded " + new_name)
def main():
tornado.options.parse_command_line()
app = Application()
app.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()