从烧瓶中的文件存储对象中提取文件
Posted
技术标签:
【中文标题】从烧瓶中的文件存储对象中提取文件【英文标题】:Extract file from file storage object in flask 【发布时间】:2018-09-27 00:03:30 【问题描述】:我正在学习如何在烧瓶中处理文件上传。在here 之前,我处理了 pdf 文件上传并阅读了它的内容。这发生在 client.py 文件中。
现在我想将我的文件从客户端传递到在本地运行的服务器。当我使用 request.file 时,它将作为 FileStorage 对象获取。因此,在不保存或提供文件路径的情况下,我想从客户端上传文件并将其传递给服务器以进行进一步处理。
class mainSessRunning():
def proces(input):
...
...
return result
run = mainSessRunning()
@app.route('/input', methods=['POST'])
def input():
input_file = request.files['file']
...(extract file from filestorage object "input_file")...
result = run.process(file) ## process is user defined function
return (result)
在这里,我想通过process()
函数将传入的文件发送到本地运行的服务器。我该怎么做呢?我遇到了same question,但找不到任何东西
【问题讨论】:
【参考方案1】:“提取”是什么意思?如果要获取文件的字节数,可以使用content = request.files['file'].read()
。
然后将此内容发送到您想要的任何地方:res = requests.post(url, content)
【讨论】:
提取我的意思是,我想获取输入文件,例如,如果我通过 POST request.files['file'] 发送 pdf 文件,我想获得相同的 pdf 文件。我不知道bytes of file
是否会帮助我。我试过 file.read() 但它抛出错误:文件“/usr/lib/python2.7/genericpath.py”,第 26 行,存在 os.stat(path) 类型错误:stat() 参数 1 必须是编码字符串没有空字节,不是 str ** PS:我不想要文件的内容。我想要它作为一个完整的文件本身**
你绝对可以做到content = input_file.read()
。而content
与open("your_saved_local_pdf.pdf", "rb").read()
从本地文件中得到的完全一样。这足以满足您的目的吗?
真的很奇怪,os.stat
TypeError 通常是在你的文件路径无效的情况下发生的,例如包含\0
。但由于input_file
实际上是由flask 自动创建的本地临时文件的包装器,因此不应发生此问题。
我这里也有类似的问题,谁能帮帮我?:***.com/questions/60824889/…
我收到“ValueError: I/O operation on closed file”。有什么想法吗?【参考方案2】:
import os
import json
from flask import Flask, render_template, url_for, request, redirect, jsonify
from PIL import Image
Upload = 'static/upload'
app = Flask(__name__)
app.config['uploadFolder'] = Upload
@app.route("/")
def index():
return render_template("Index.html")
@app.route("/upload", methods = ['POST', 'GET'])
def upload():
file = request.files['imgfile']
filename = file.filename
file.save(os.path.join(app.config['uploadFolder'], file.filename))
print(file.filename)
img = Image.open(file)
li = []
li = img.size
imgobj =
"name" : filename,
"width" : li[0],
"height" : li[1]
json_data = json.dumps(imgobj)
with open('jsonfile.json', 'w') as json_file:
json.dump(imgobj, json_file)
return render_template('index.html', filename = filename) # comment this line to only get the json data.
# return render_template('index.html', json_data = json_data) # uncomment this line to get only json data.
if __name__ == "__main__":
app.run(debug = True, port = 4455)
如果您想从文件存储对象中提取文件,请按照以下步骤操作: 通过使用下面的代码,您可以从文件存储对象中保存文件并将其保存在本地
<!DOCTYPE html>
<html>
<head>
<title>Assignment</title>
</head>
<body>
% if filename %
<div>
<h1>filename</h1>
<img src=" url_for('static', filename='upload/'+filename) ">
</div>
% endif % <!-- comment this div to only get the json data.-->
<form method="post" action="/upload" enctype="multipart/form-data">
<dl>
<p>
<input type="file" name="imgfile" autocomplete="off" required>
</p>
</dl>
<p>
<button type="submit" value="Submit"> Submit</button>
</p>
</form>
<!-- % if json_data %
<div>
<p> json_data
</div>
% endif % --> <!-- uncomment this div to only get the json data.-->
</body>
</html>
【讨论】:
这是一个包含大量信息的非常好的答案 - 但它的编写方式有点混乱,很难提取所有知识:-)以上是关于从烧瓶中的文件存储对象中提取文件的主要内容,如果未能解决你的问题,请参考以下文章