如何用python中的Klein-like-Flask接收上传文件

2024-06-16 09:14:35 发布

您现在位置: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,但是这看起来像是从web服务提供文件,而不是接收上载到web服务的文件。如果我想让我的Klein服务器能够接收abc.jpg并将其保存在文件系统中,是否有任何文档可以指导我实现该目标?在


Tags: 文件用户文档webflaskdatetimerequestfiles
1条回答
网友
1楼 · 发布于 2024-06-16 09:14:35

正如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)

不管出于什么原因,我的python3.4(ubuntu14.04)版本的cgi.FieldStorage没有返回正确的结果。我在python2.7.11上进行了测试,它运行得很好。尽管如此,您还可以在前端收集文件名和其他元数据,并通过ajax调用将它们发送给klein。这样你就不必在后端做太多的处理(这通常是件好事)。或者,您可以了解如何使用werkzeug提供的实用程序。函数werkzeug.secure_filename和{}(即FileStorage)并不特别难实现或重新创建。在

相关问题 更多 >