如何使用 Flask-RESTPlus 发布多个文件?

Joe*_*oey 6 python file-upload flask flask-restplus

我希望能够发布一组文件。action="append"我让它可以使用单个文件,但在添加到解析器时它不起作用。添加时action,swagger UI 允许我上传多个文件,但在打印files变量时None,即使我选择了多个文件也是如此。如何使用 Flask-RESTPlus POST 一组文件?

    from flask_restplus import Namespace, Resource, reqparse
    from werkzeug.datastructures import FileStorage

    file_upload = Namespace(name="files")
    upload_parser = reqparse.RequestParser(bundle_errors=True)
    upload_parser.add_argument(
        name="files",
        type=FileStorage,
        location="files",
        action="append" # If this is removed it works with 1 file
    )

    @files_upload.route("/")
    class Files(Resource):
        @files_upload.expect(upload_parser)
        def post(self):
            args = upload_parser.parser_args()
            files = args["files"]
            do_something(files)
            return ""
Run Code Online (Sandbox Code Playgroud)

Ram*_*amy 5

尝试用request.files.getlist

class UploadImg(Resource):

   def store_images(self,image,filename):
       S3_KEY = '************'
       S3_SECRET = '****************'
       S3_BUCKET = '****'
       file='pictures/'+filename
       content_type = request.mimetype
       s3 = boto3.client('s3', 
       config=boto3.session.Config(signature_version='s3v4'),
                      region_name='ap-south-1',
                      aws_access_key_id=S3_KEY,
                      aws_secret_access_key=S3_SECRET)
       s3.put_object(Body=image,    Bucket=S3_BUCKET,     Key=file,       
                  ContentType=content_type)

    def post(self):
       files= request.files.getlist('image')
       for img in files:
           print(type(img))
           print(img.filename)
           self.store_images(img,img.filename)
        return '',201
Run Code Online (Sandbox Code Playgroud)


小智 3

from flask import Flask
from flask_restplus import Api, Resource
import werkzeug
from werkzeug.utils import secure_filename
from flask_restplus import reqparse
import os



file_upload = reqparse.RequestParser()
file_upload.add_argument('doc1',
                         type=werkzeug.datastructures.FileStorage, 
                         location='files', 
                         required=True, 
                         help='Document 1')
file_upload.add_argument('doc2',
                         type=werkzeug.datastructures.FileStorage, 
                         location='files', 
                         required=True, 
                         help='Document 1')
file_upload.add_argument('doc3',
                         type=werkzeug.datastructures.FileStorage, 
                         location='files', 
                         required=True, 
                         help='Document 1')
app = Flask(__name__)
api = Api(app = app)

app.config['Upload_folder'] = './static/'

@api.route('/upload/')
class my_file_upload(Resource):
    @api.expect(file_upload)
    def post(self):
        args = file_upload.parse_args()
        args['doc1'].save(os.path.join(app.config['Upload_folder'],secure_filename(args['doc1'].filename)))
        args['doc2'].save(os.path.join(app.config['Upload_folder'],secure_filename(args['doc1'].filename)))
        args['doc3'].save(os.path.join(app.config['Upload_folder'],secure_filename(args['doc1'].filename)))
        a = [args['doc1'],args['doc2'],args['doc3']]
        print(type(a))
        return {'status': 'Done'}

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)