Python restplus API to upload and dowload files

11,065

First you need to configure a parser

# parsers.py
import werkzeug
from flask_restplus import reqparse

file_upload = reqparse.RequestParser()
file_upload.add_argument('xls_file',  
                         type=werkzeug.datastructures.FileStorage, 
                         location='files', 
                         required=True, 
                         help='XLS file')

Then add a new resource to your api namespace

# api.py
import …
import parsers

@api.route('/upload/')
class my_file_upload(Resource):
    @api.expect(parsers.file_upload)
    def post(self):
        args = parsers.file_upload.parse_args()
        if args['xls_file'].mimetype == 'application/xls':
            destination = os.path.join(current_app.config.get('DATA_FOLDER'), 'medias/')
            if not os.path.exists(destination):
                os.makedirs(destination)
            xls_file = '%s%s' % (destination, 'custom_file_name.xls')
            args['xls_file'].save(xls_file)
        else:
            abort(404)
        return {'status': 'Done'}

I hope this helps.

Share:
11,065
user3313834
Author by

user3313834

Updated on June 15, 2022

Comments

  • user3313834
    user3313834 almost 2 years

    With python flask_restplus what is correct way to have a post and get methods to get and push a file e.g. xlsx to the server ?

    Does the marshaling need to be used for this ?

    reference: https://philsturgeon.uk/api/2016/01/04/http-rest-api-file-uploads/

    This answer give general info but not in the python>flask>restplus context: REST API File Upload

  • MichalMazurek
    MichalMazurek over 7 years
    To do it in a restful way I think you should first create a file object so: POST /api/v1/file {"meta": "some data"} then you receive file object so: {"meta": "some data", "created_time": "timestamp", "id": 1}, then you add the attachment using PUT with the binary of file so: PUT /api/v1/file/1/attachment
  • MichalMazurek
    MichalMazurek over 7 years
    PUT or POST if you are doing it with simple html form
  • balu
    balu about 6 years
    @samurai I agree that this would usually be the way to go. The problem with this approach, though, is that Flask-RESTPlus doesn't support passing the binary blob as request body directly (nor does Swagger 2.0). Instead one has to resort to using the form data approach k3z suggested in his answer – at least if one wishes to describe the file upload API (and in particular the expected Content-Type for requests) using Swagger.