6

I am stuck in a problem where I am trying to build single API which will upload file along with json object. I need this API to create webhook.

Using multi part, I am able to upload file and in option filed I am able to send json object.

In flask app when I am trying to retrieve json object its converting as blob type. I tried to convert it base64 then again converting into string but whole process is not working.

Let me know if anyone has good solution I can combine file and json object together and fetch it by flask python app.

zz is the variable in my code where I am trying to store my json object. name is the field where I am passing my json object with file.

Thanks in advance.

My current code

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)

2 Answers 2

11

I have got the answer after lot R&D.

request format

//user any client-side

content-type:multipart/form-data
 file: file need to upload 
 data: {"name":"abc","new_val":1}

python code to fetch from request object

data=json.loads(request.form.get('data'))
file = request.files['file']
Sign up to request clarification or add additional context in comments.

Comments

7

Just send the file and json at once and let request handle the rest. You can try the code below:

Server side:

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)

Client Side:

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)

3 Comments

I have tied with this solution. request.files['data'] its showing <FileStorage: 'blob' ('application/json')> not able to convert it back to json
FYI secure_file is in werkzeug.utils now.
If you have NameError: name 'secure_filename' is not defined. There are two solutions: 1. Change from werkzeug import secure_filename to from werkzeug.utils import secure_filename 2. pip install -U Werkzeug==0.16.0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.