Simple Python Webserver to save file

前端 未结 2 740
情深已故
情深已故 2020-12-15 21:39

I\'m trying to make a simple python webserver to save text that is Posted to a file called store.json which is in the same folder as the python scr

相关标签:
2条回答
  • 2020-12-15 21:45

    Important thing is that you will have to build cgi.FieldStorage properly from the raw posted data e.g.

    form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
    

    after that it is easy to dump file, here is a simple handler which shows a form on do_GET to upload any file user chooses and saves that file to /tmp in do_POST when form is POSTed

    from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
    
    import cgi
    
    class StoreHandler(BaseHTTPRequestHandler):
        def do_POST(self):
    
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
            filename = form['file'].filename
            data = form['file'].file.read()
            open("/tmp/%s"%filename, "wb").write(data)
    
            self.respond("uploaded %s, thanks"%filename)
    
        def do_GET(self):
            response = """
            <html><body>
            <form enctype="multipart/form-data" method="post">
            <p>File: <input type="file" name="file"></p>
            <p><input type="submit" value="Upload"></p>
            </form>
            </body></html>
            """        
    
            self.respond(response)
    
        def respond(self, response, status=200):
            self.send_response(status)
            self.send_header("Content-type", "text/html")
            self.send_header("Content-length", len(response))
            self.end_headers()
            self.wfile.write(response)  
    

    Also note that self.respond is not a standard method I just added it for quickly returning some response.

    0 讨论(0)
  • 2020-12-15 21:51

    Here's the general idea:

    from os import curdir
    from os.path import join as pjoin
    
    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    class StoreHandler(BaseHTTPRequestHandler):
        store_path = pjoin(curdir, 'store.json')
    
        def do_GET(self):
            if self.path == '/store.json':
                with open(self.store_path) as fh:
                    self.send_response(200)
                    self.send_header('Content-type', 'text/json')
                    self.end_headers()
                    self.wfile.write(fh.read().encode())
    
        def do_POST(self):
            if self.path == '/store.json':
                length = self.headers['content-length']
                data = self.rfile.read(int(length))
    
                with open(self.store_path, 'w') as fh:
                    fh.write(data.decode())
    
                self.send_response(200)
    
    
    server = HTTPServer(('', 8080), StoreHandler)
    server.serve_forever()
    
    $ curl -X POST --data "one two three four" localhost:8080/store.json
    $ curl -X GET localhost:8080/store.json    
    one two three four%
    
    0 讨论(0)
提交回复
热议问题