瓶子文件上传和处理

2024-05-12 15:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我的问题是:

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

Tags: 文件代码org路径程序运行webhttpdocs
3条回答

好吧,让我们把这个分解。

完整代码是:

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中,您可能正在处理管道或子流程,以便将数据传递给这些“工具”。

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

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

不工作

你可以用

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

相关问题 更多 >