瓶文件上传和处理

时间:2013-01-12 18:15:55

标签: python file-upload bottle

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

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

我的问题是:

  • 瓶子存储上传的文件是在内存中还是在磁盘上的特定位置(或者像Flask,两者都有)?
  • 上传的文件是否可以直接用于没有.read()的其他工具,然后手动将字节保存到磁盘上的指定文件中?
  • 以文件作为参数启动系统命令的最佳方法是什么?是否可以直接将路径传递给现有文件?

4 个答案:

答案 0 :(得分:16)

好的,让我们打破这个。

完整的代码是:

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中提取信息,并将它们分配给变量name和{ {1}}。这很直接。但是,接下来我们将变量data分配给raw。这基本上是将所有文件上传到变量data.file.read()中。话虽这么说,整个文件都在内存中,这就是为什么他们放置&#34;这对于大文件而言是危险的#34;作为该行旁边的评论。

这就是说,如果你想把文件保存到磁盘上,你可以这样做(但小心)使用类似的东西:

raw

至于你的其他问题:

1。&#34;以文件作为参数启动系统命令的最佳方法是什么?是否可以直接将路径传递给现有文件?&#34;

您应该看到with open(filename,'w') as open_file: open_file.write(data.file.read()) 模块,特别是subprocesshttp://docs.python.org/2/library/subprocess.html#popen-constructor

2.&#34;上传的文件是否可以直接用于没有.read()的其他工具,然后手动将字节保存到磁盘上的指定文件中?&#34;

是的,您可以传递文件数据而不将其保存到磁盘,但是,请注意,内存消耗是值得关注的。但是,如果这些&#34;工具&#34;不在python中,您可能正在处理管道或子进程以将数据传递给这些&#34;工具&#34;。

答案 1 :(得分:4)

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

不工作

你可以使用

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/airflow/models/dagbag.py", line 236, in process_file
    m = imp.load_source(mod_name, filepath)
  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/imp.py", line 171, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 696, in _load
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/ben.muller/airflow/dags/nba_dag.py", line 5, in <module>
    from airflow.operators.docker_operator import DockerOperator
  File "/usr/local/lib/python3.7/site-packages/airflow/operators/docker_operator.py", line 25, in <module>
    from docker import APIClient, tls
ModuleNotFoundError: No module named 'docker'

容易:D