在python Flask应用程序中使用json对象上传文件的POST方法

Ash*_*pta 4 python multipartform-data flask python-3.x flask-restful

我遇到了一个问题,我试图构建单个 API,它将上传文件和 json 对象。我需要这个 API 来创建 webhook。

使用多部分,我可以上传文件,并且在选项文件中我可以发送 json 对象。

在 Flask 应用程序中,当我尝试检索 json 对象时,将其转换为 blob 类型。我尝试将其转换为 base64,然后再次转换为字符串,但整个过程不起作用。

如果有人有好的解决方案,请告诉我,我可以将文件和 json 对象组合在一起,并通过 Flask python 应用程序获取它。

zz 是我的代码中的变量,我试图在其中存储我的 json 对象。name 是我通过文件传递我的 json 对象的字段。

提前致谢。

我当前的代码

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/upload/',methods = ['POST'])
def upload():
    customer_name='abc'
    if request.method == 'POST':

        zz=base64.b64encode(request.files['name'].read())
        try:
            file = request.files['file']
            if file:
                file.filename=customer_name+'_'+str(datetime.now())+'.'+file.filename.split('.')[-1]
                filename = secure_filename(file.filename)
                path=os.path.join(app.config['UPLOAD_FOLDER'], filename)
                file.save(path)

            return jsonify({
                'status':success,
                'junk_data':[],
                'message':error
                })
        except Exception as err:
            logger.error(str(datetime.now())+' '+str(err))
            return jsonify({
                'status':False,
                'junk_data':[],
                'message':str(err)
                })
if __name__ == '__main__':
    app.run(host='localhost',debug=True, use_reloader=True,port=5000)
Run Code Online (Sandbox Code Playgroud)

小智 7

只需立即发送文件和 json,然后让我们request处理其余的事情。您可以尝试以下代码:

服务器端:

import json                                                     
import os
from flask import Flask, request
from werkzeug import secure_filename

app = Flask(__name__)                                           


@app.route('/test_api',methods=['GET','POST'])            
def test_api():                                           
    uploaded_file = request.files['document']
    data = json.load(request.files['data'])
    filename = secure_filename(uploaded_file.filename)
    uploaded_file.save(os.path.join('path/where/to/save', filename))
    print(data)
    return 'success'

if __name__ == '__main__':
    app.run(host='localhost', port=8080)
Run Code Online (Sandbox Code Playgroud)

客户端:

import json
import requests

data = {'test1':1, 'test2':2}

filename = 'test.txt'
with open(filename, 'w') as f:
    f.write('this is a test file\n')

url = "http://localhost:8080/test_api"

files = [
    ('document', (filename, open(filename, 'rb'), 'application/octet')),
    ('data', ('data', json.dumps(data), 'application/json')),
]

r = requests.post(url, files=files)
print(r)
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 secure_file 现在位于 werkzeug.utils 中。 (4认同)

Ash*_*pta 6

经过大量研发,我得到了答案。

请求格式

//user any client-side

content-type:multipart/form-data
 file: file need to upload 
 data: {"name":"abc","new_val":1}
Run Code Online (Sandbox Code Playgroud)

从请求对象中获取的python代码

data=json.loads(request.form.get('data'))
file = request.files['file']
Run Code Online (Sandbox Code Playgroud)