欢迎访问宙启技术站
智能推送

在Python中使用CherryPyWSGI服务器实现文件上传与下载功能

发布时间:2023-12-26 02:51:40

实现文件上传和下载功能可以使用CherryPy的tools.staticdirtools.staticfile工具,并结合CherryPy的路由功能。

下面是一个使用CherryPy实现文件上传和下载功能的示例代码:

import os
import cherrypy
from cherrypy.lib.static import serve_file

class FileHandler(object):
    @cherrypy.expose
    def index(self):
        return """
        <html>
        <head></head>
        <body>
            <h1>文件上传与下载示例</h1>
            <form method="post" enctype="multipart/form-data" action="upload">
                <input type="file" name="myFile" />
                <button type="submit">上传文件</button>
            </form>
            <br>
            <a href="download?filename=myfile.txt">下载文件</a>
        </body>
        </html>
        """

    @cherrypy.expose
    def upload(self, myFile):
        upload_dir = "./uploads"
        if not os.path.exists(upload_dir):
            os.makedirs(upload_dir)

        save_path = os.path.join(upload_dir, myFile.filename)
        with open(save_path, 'wb') as f:
            while True:
                data = myFile.file.read(8192)
                if not data:
                    break
                f.write(data)

        return "文件上传成功!"

    @cherrypy.expose
    def download(self, filename):
        download_dir = "./uploads"
        file_path = os.path.join(download_dir, filename)

        return serve_file(file_path, "application/x-download", "attachment")

if __name__ == '__main__':
    config = {
        '/': {
            'tools.staticdir.on': True,
            'tools.staticdir.dir': os.path.abspath(os.path.dirname(__file__))
        }
    }
    cherrypy.config.update({'server.socket_host': '0.0.0.0'})
    cherrypy.quickstart(FileHandler(), "/", config=config)

在上述代码中,使用CherryPy提供的tools.staticdir工具来服务静态文件,将当前目录作为根目录。当访问根URL时,显示一个包含文件上传和下载功能的页面。文件上传通过一个POST请求来处理,并将上传的文件保存在./uploads目录下。文件下载通过cherrypy.lib.static.serve_file函数来实现,并添加Content-Disposition头部,使浏览器将其作为附件下载。

启动以上代码后,您可以通过http://localhost:8080访问示例页面。页面显示一个文件上传的表单和一个文件下载的链接。您可以选择一个文件点击“上传文件”按钮来上传文件,并点击“下载文件”链接来下载刚刚上传的文件。

注意,该示例没有添加身份验证或文件类型检查等安全措施,仅供演示。在实际应用中,建议添加适当的安全和验证机制来保护文件上传和下载功能。