0

ユーザーがサーバーで Tornado を使用して PhoneGap アプリケーションから写真をアップロードできるようにする必要があったため、別の質問にあるコードを使用しました: How to upload an image with python-tornado from an HTML form?

そこに見られるコードは完全に正常に動作します。残念ながら、私がサーバーに送信しているのはファイルではなく、base64 でエンコードされた文字列です。そこで、UNIX マシンで「テスト ラボ」を立ち上げ、コードにいくつかの変更を加えたので、文字列と、文字列をデコードした後にファイルに名前を付けるために必要な別の引数を受け取ることができました。サービスを起動すると正常に起動しますが、ブラウザからアクセスしようとすると、すぐに 500: Internal Server Error と表示されます。私が変更したコードの唯一の部分は 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()
4

0 に答える 0