【问题标题】: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,但找不到任何东西

【问题讨论】:

    标签: python python-2.7 file-upload flask object-storage


    【解决方案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()。而contentopen("your_saved_local_pdf.pdf", "rb").read() 从本地文件中得到的完全一样。这足以满足您的目的吗?
    • 真的很奇怪,os.stat TypeError 通常是在你的文件路径无效的情况下发生的,例如包含\0。但由于input_file 实际上是由flask 自动创建的本地临时文件的包装器,因此不应发生此问题。
    • 我这里也有类似的问题,谁能帮帮我?:stackoverflow.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>

    【讨论】:

    • 这是一个包含大量信息的非常好的答案 - 但它的编写方式有点混乱,很难提取所有知识:-)
    猜你喜欢
    • 2017-01-19
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2021-01-23
    • 2011-03-27
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多