【问题标题】:Bottle file upload and process瓶子文件上传和处理
【发布时间】:2012-12-27 02:44:02
【问题描述】:

我正在使用 Bottle 上传相当大的文件。这个想法是,当文件上传时,网络应用程序运行(并忘记)一个系统命令,其中上传的文件路径作为参数。除了使用正确的文件路径作为参数启动系统命令外,我不需要保存文件,但我需要确定文件在进程完成处理之前可用。

我使用此处描述的确切代码: http://bottlepy.org/docs/dev/tutorial.html#post-form-data-and-file-uploads

我的问题是:

  • Bottle 是否将上传的文件存储在内存中或磁盘上的特定位置(或者可能像 Flask 一样,两者兼而有之)?
  • 上传的文件是否可以在没有 .read() 的情况下直接供其他工具使用,然后手动将字节保存到磁盘上的指定文件中?
  • 以文件作为参数启动系统命令的最佳方式是什么?是否可以直接将路径传递给现有文件?

【问题讨论】:

    标签: python file-upload bottle


    【解决方案1】:
    with open(filename, "wb") as file:
      Data = data.file.read()
      if type(Data) == bytes: file.write(Data)
      elif type(Data) == str: file.write(Data.encode("utf-8"))
    

    简单:D

    【讨论】:

      【解决方案2】:
       with open(filename,'w') as open_file:
          open_file.write(data.file.read())
      

      不工作

      你可以使用

      data = request.files.data
      data.save(Path,overwrite=True)
      

      【讨论】:

        【解决方案3】:

        文件将由您使用的例程处理。这意味着您的读取处理了连接(根据 wsgi 规范,该文件不应该存在)

        【讨论】:

          【解决方案4】:

          好的,让我们分解一下。

          完整代码为:

          HTML:

          <form action="/upload" method="post" enctype="multipart/form-data">
            <input type="text" name="name" />
            <input type="file" name="data" />
          </form>
          

          Python 代码:

          from bottle import route, request
          @route('/upload', method='POST')
          def do_upload():
              name = request.forms.name
              data = request.files.data
              if name and data and data.file:
                  raw = data.file.read() # This is dangerous for big files
                  filename = data.filename
                  return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))
              return "You missed a field."
          

          (根据您提供的文档)

          所以,首先我们可以看到,我们首先从html表单中的namedata拉取信息,并将它们赋值给变量namedata。这很简单。但是,接下来我们将变量raw 分配给data.file.read()。这基本上是将所有文件上传到变量raw。话虽如此,整个文件都在内存中,这就是为什么他们将“这对大文件很危险”作为注释放在该行旁边。

          话虽如此,如果您想将文件保存到磁盘,您可以这样做(但要小心)使用类似的方法:

          with open(filename,'w') as open_file:
              open_file.write(data.file.read())
          

          至于你的其他问题:

          1.“以文件作为参数启动系统命令的最佳方式是什么?是否可以直接将路径传递给现有文件?”

          您应该看到subprocess 模块,特别是Popenhttp://docs.python.org/2/library/subprocess.html#popen-constructor

          2.“上传的文件是否会直接提供给其他工具而不需要.read(),然后手动将字节保存到磁盘上的指定文件中?”

          是的,您可以在不将其保存到磁盘的情况下传递文件数据,但是请注意内存消耗是需要注意的。但是,如果这些“工具”不在 python 中,您可能正在处理管道或子进程以将数据传递给这些“工具”。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 2013-10-06
          • 2013-02-09
          • 1970-01-01
          • 2012-06-11
          • 2012-05-20
          • 2013-11-01
          相关资源
          最近更新 更多