python requests file upload

后端 未结 4 686
醉梦人生
醉梦人生 2020-11-22 13:20

I\'m performing a simple task of uploading a file using Python requests library. I searched Stack Overflow and no one seemed to have the same problem, namely, that the file

4条回答
  •  误落风尘
    2020-11-22 13:25

    Client Upload

    If you want to upload a single file with Python requests library, then requests lib supports streaming uploads, which allow you to send large files or streams without reading into memory.

    with open('massive-body', 'rb') as f:
        requests.post('http://some.url/streamed', data=f)
    

    Server Side

    Then store the file on the server.py side such that save the stream into file without loading into the memory. Following is an example with using Flask file uploads.

    @app.route("/upload", methods=['POST'])
    def upload_file():
        from werkzeug.datastructures import FileStorage
        FileStorage(request.stream).save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return 'OK', 200
    

    Or use werkzeug Form Data Parsing as mentioned in a fix for the issue of "large file uploads eating up memory" in order to avoid using memory inefficiently on large files upload (s.t. 22 GiB file in ~60 seconds. Memory usage is constant at about 13 MiB.).

    @app.route("/upload", methods=['POST'])
    def upload_file():
        def custom_stream_factory(total_content_length, filename, content_type, content_length=None):
            import tempfile
            tmpfile = tempfile.NamedTemporaryFile('wb+', prefix='flaskapp', suffix='.nc')
            app.logger.info("start receiving file ... filename => " + str(tmpfile.name))
            return tmpfile
    
        import werkzeug, flask
        stream, form, files = werkzeug.formparser.parse_form_data(flask.request.environ, stream_factory=custom_stream_factory)
        for fil in files.values():
            app.logger.info(" ".join(["saved form name", fil.name, "submitted as", fil.filename, "to temporary file", fil.stream.name]))
            # Do whatever with stored file at `fil.stream.name`
        return 'OK', 200
    

提交回复
热议问题