好的,让我们分解一下。
完整的代码是:
HTML:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="file" name="data" />
</form>
蟒蛇代码:
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 表单中的name
和data
中拉取信息,并将它们赋值给变量name
和data
。这很简单。但是,接下来我们将变量分配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 中,您可能正在处理管道或子进程以将数据传递给这些“工具”。