CherryPy获取上传文件的临时位置

时间:2015-10-07 04:07:25

标签: python cherrypy

CherryPy中的文件Uppload:

    def upload(self, myFile):
        out = """File name: %s, Content-Type: %"""
        return out % (myFile.filename, myFile.content_type)
    upload.exposed = True

来自docs

  

当客户端将文件上传到CherryPy应用程序时,它会被放置   磁盘立即。 CherryPy将它作为一个传递给你暴露的方法   参数(见下文“myFile”);该arg将具有“文件”属性,   这是临时上传文件的句柄。如果你愿意的话   永久保存文件,你需要从myFile.file读取()和   在其他地方写()。

如何上传文件的临时位置?

1 个答案:

答案 0 :(得分:1)

使用默认实体处理器无法获取临时文件的名称。但您可以设置自己的自定义文件,以确保始终创建临时文件(通常不会为文件创建< 1000字节)。

要在临时文件中使用名称,您需要使用NamedTemporaryFile类创建的CustomPart

import tempfile
import cherrypy as cp

class App:

    @cp.expose
    def index(self):
        return """
        <html><body>
            <h2>Upload a file</h2>
            <form action="upload" method="post" enctype="multipart/form-data">
            filename: <input type="file" name="my_file" /><br />
            <input type="submit" />
            </form>
        </body></html>
        """

    @cp.expose
    def upload(self, my_file):
        return "The path is %s" % my_file.file.name


class CustomPart(cp._cpreqbody.Part):
    """
    Custom entity part that it will alway create a named
    temporary file for the entities.
    """
    maxrambytes = 0 # to ensure that it doesn't store it in memory

    def make_file(self):
        return tempfile.NamedTemporaryFile()


if __name__ == '__main__':
    cp.quickstart(App(), config={
        '/': {
            'request.body.part_class': CustomPart
        }
    })

请求完成后您将无法看到该文件,因为默认情况下NamedTemporaryFile类会在文件关闭后立即删除该文件。在这种情况下,一旦请求完成。你可以像这样添加一些睡眠调用并验证我刚刚说过的内容:

   @cp.expose
   def upload(self, my_file):
        import time
        cp.log.error("You have 30 seconds to open the temporary file %s" % my_file.file.name)
        time.sleep(30)
        return "The path is %s" % my_file.file.name

如果你真的想保留临时文件,那么你只需要在delete上将False参数设置为NamedTemporaryFile,最后得到类似的结果:

 class CustomPart(cp._cpreqbody.Part):
        """
        Custom entity part that it will alway create a named
        temporary file for the entities.
        """
        maxrambytes = 0 # to ensure that it doesn't store it in memory

        def make_file(self):
            return tempfile.NamedTemporaryFile(delete=False)

您必须确保自行删除这些临时文件。