flask-graphql icon indicating copy to clipboard operation
flask-graphql copied to clipboard

File Upload

Open vladinator1000 opened this issue 7 years ago • 7 comments

I'm working on an example repo and was wondering, what would be the simplest way to implement that? This is what I tried without GraphQL:

@app.route('/upload', methods=['POST'])
def uploadFile():
	for key in request.files:
		file = request.files[key]
		file.save(os.path.join(UPLOAD_FOLDER, file.filename))
	
	return 'uploaded'

This is what I used in Node.js, would love to do something like that for Flask in Python.

If it's not supported by flask-graphql I'd be happy to work on a pull request. Also, how would you test this without a browser, using Graphiql, Postman or something like that?

vladinator1000 avatar Sep 21 '17 00:09 vladinator1000

    def mutate(cls, info, **kwargs):

        file = info.context.files.get('file', None)

michaelkuty avatar Apr 21 '18 20:04 michaelkuty

@michaelkuty can you make it work with Apollo? I got "Must provide query string." error when trying to send multipart/form-data; to the server.

hxuanhung avatar May 04 '18 09:05 hxuanhung

In apollo you must use something like middleware or something else..

michaelkuty avatar May 04 '18 11:05 michaelkuty

hm, have you actually worked on it? I'm using https://github.com/jaydenseric/apollo-upload-client for a client that sends multipart/form-data to the server but it seems not working.

hxuanhung avatar May 04 '18 12:05 hxuanhung

Ok, just managed to get it to work with Apollo. The problem lies with incorrect handling of the multipart-encoded request, here: https://github.com/graphql-python/flask-graphql/blob/master/flask_graphql/graphqlview.py#L126-L127

I sub-classed the GraphQLView to properly handle multipart/form-data, as per the spec. I also created a custom scalar field that can be used for file uploads, so no need to get files out of info.context or flask.request.

https://gist.github.com/rshk/97fd7b444e48c60218addb2b64897572

This will work with the version of flask-graphql currently in pypi; I haven't tested whith the master version yet (but should still work).

I can open a PR with the changes (I have unit tests covering that place_files_in_operations too).

rshk avatar May 24 '18 16:05 rshk

Similar to https://github.com/lmcgartland/graphene-file-upload/blob/master/graphene_file_upload/init.py We can change a few things like I mentioned in https://github.com/lmcgartland/graphene-file-upload/issues/3 to make it work for Flask.

hxuanhung avatar May 24 '18 18:05 hxuanhung

See #51

rshk avatar Jul 24 '18 21:07 rshk