如何在 python 中像 Flask 一样使用 Klein 接收上传的文件
How to receive uploaded file with Klein like Flask in python
搭建Flask服务器时,我们可以尝试接收用户上传的文件
imagefile = flask.request.files['imagefile']
filename_ = str(datetime.datetime.now()).replace(' ', '_') + \
werkzeug.secure_filename(imagefile.filename)
filename = os.path.join(UPLOAD_FOLDER, filename_)
imagefile.save(filename)
logging.info('Saving to %s.', filename)
image = exifutil.open_oriented_im(filename)
当我查看 Klein
文档时,我看到了 http://klein.readthedocs.io/en/latest/examples/staticfiles.html
,但这似乎是从网络服务提供文件,而不是接收已上传到网络服务的文件。如果我想让我的 Klein
服务器能够接收 abc.jpg
并将其保存在文件系统中,是否有任何文档可以指导我实现 objective?
正如 Liam Kelly
评论的那样,来自 this post 的片段应该有效。使用 cgi.FieldStorage
可以轻松发送文件元数据而无需显式发送。 Klein/Twisted 方法看起来像这样:
from cgi import FieldStorage
from klein import Klein
from werkzeug import secure_filename
app = Klein()
@app.route('/')
def formpage(request):
return '''
<form action="/images" enctype="multipart/form-data" method="post">
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
'''
@app.route('/images', methods=['POST'])
def processImages(request):
method = request.method.decode('utf-8').upper()
content_type = request.getHeader('content-type')
img = FieldStorage(
fp = request.content,
headers = request.getAllHeaders(),
environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type})
name = secure_filename(img[b'datafile'].filename)
with open(name, 'wb') as fileOutput:
# fileOutput.write(img['datafile'].value)
fileOutput.write(request.args[b'datafile'][0])
app.run('localhost', 8000)
出于某种原因,我的 Python 3.4 (Ubuntu 14.04) 版本的 cgi.FieldStorage
没有 return 正确的结果。我在 Python 2.7.11 上对此进行了测试,它工作正常。话虽如此,您还可以在前端收集文件名和其他元数据,然后通过 ajax 调用将它们发送给 klein。这样您就不必在后端做太多处理(这通常是一件好事)。或者,您可以了解如何使用 werkzeug 提供的实用程序。函数 werkzeug.secure_filename
和 request.files
(即 FileStorage
)实现或重新创建并不是特别困难。
搭建Flask服务器时,我们可以尝试接收用户上传的文件
imagefile = flask.request.files['imagefile']
filename_ = str(datetime.datetime.now()).replace(' ', '_') + \
werkzeug.secure_filename(imagefile.filename)
filename = os.path.join(UPLOAD_FOLDER, filename_)
imagefile.save(filename)
logging.info('Saving to %s.', filename)
image = exifutil.open_oriented_im(filename)
当我查看 Klein
文档时,我看到了 http://klein.readthedocs.io/en/latest/examples/staticfiles.html
,但这似乎是从网络服务提供文件,而不是接收已上传到网络服务的文件。如果我想让我的 Klein
服务器能够接收 abc.jpg
并将其保存在文件系统中,是否有任何文档可以指导我实现 objective?
正如 Liam Kelly
评论的那样,来自 this post 的片段应该有效。使用 cgi.FieldStorage
可以轻松发送文件元数据而无需显式发送。 Klein/Twisted 方法看起来像这样:
from cgi import FieldStorage
from klein import Klein
from werkzeug import secure_filename
app = Klein()
@app.route('/')
def formpage(request):
return '''
<form action="/images" enctype="multipart/form-data" method="post">
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
'''
@app.route('/images', methods=['POST'])
def processImages(request):
method = request.method.decode('utf-8').upper()
content_type = request.getHeader('content-type')
img = FieldStorage(
fp = request.content,
headers = request.getAllHeaders(),
environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type})
name = secure_filename(img[b'datafile'].filename)
with open(name, 'wb') as fileOutput:
# fileOutput.write(img['datafile'].value)
fileOutput.write(request.args[b'datafile'][0])
app.run('localhost', 8000)
出于某种原因,我的 Python 3.4 (Ubuntu 14.04) 版本的 cgi.FieldStorage
没有 return 正确的结果。我在 Python 2.7.11 上对此进行了测试,它工作正常。话虽如此,您还可以在前端收集文件名和其他元数据,然后通过 ajax 调用将它们发送给 klein。这样您就不必在后端做太多处理(这通常是一件好事)。或者,您可以了解如何使用 werkzeug 提供的实用程序。函数 werkzeug.secure_filename
和 request.files
(即 FileStorage
)实现或重新创建并不是特别困难。