python - Bottle文件上传及处理

标签 python file-upload bottle

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

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

我的问题是:

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

最佳答案

好吧,让我们分解一下。

完整代码为:

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中拉取信息,赋值给变量名称数据。这很简单。但是,接下来我们将变量 raw 分配给 data.file.read()。这基本上是将所有 上传到变量raw 中的文件。话虽如此,整个文件都在内存中,这就是为什么他们将“这对大文件来说很危险”作为注释放在该行旁边。

话虽这么说,如果您想将文件保存到磁盘,您可以(但小心)使用类似的东西:

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

关于您的其他问题:

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

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

2."上传的文件是否可以不通过.read()然后手动保存到磁盘上的指定文件中直接供其他工具使用?"

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

关于python - Bottle文件上传及处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296438/

相关文章:

iphone - 适用于 iPhone 的 FileUploader 插件 (PhoneGap)

file-upload - Selenium、PHPUnit 和 AttachFile()

python - 如何让Python Bottle识别多个根路径

python - 使用谷歌应用程序引擎部署 Bottle 应用程序时出现问题

python 3 : importing a function from a python file in a parent directory

python - 设置 Django WSGI 工作人员具有长外部 API 响应

javascript - 仅使用 JavaScript 上传进度

python - Bottle 是否处理非并发请求?

python - numpy.vectorize 返回不正确的值

python - 数组中对应于另一个数组的值的平均值