'dart http and python flask: difference between request.files and request.form?

I'm sending a MultipartRequest with Dart and receiving it with Flask:

var request = http.MultipartRequest('POST', url)
  ..files.add(http.MultipartFile.fromBytes('thumbnail', thumbnail))
  ..files.add(await http.MultipartFile.fromPath('video', videoPath));
print('request.files: ');
print(request.files);
var streamedResponse = await request.send();
var response = await http.Response.fromStream(streamedResponse);

Printing request.files shows that I have 2 MultipartFiles, as expected:

flutter: request.files:
flutter: [Instance of 'MultipartFile', Instance of 'MultipartFile']

Then, I process the request in Flask:

@app.route('/addPost', methods=['POST'])
def addPost():
    print('request.form: ')
    print(request.form)
    print('request.files: ')
    print(request.files)
    video = request.files['video']
    thumbnail = request.files['thumbnail']

However, only 'video' is present in request.files, while 'thumbnail' is actually in request.form:

request.form: 
ImmutableMultiDict([('thumbnail', '<massive string here>')])
request.files: 
ImmutableMultiDict([('video', <FileStorage: 'trim.EE219D47-2D36-4A58-A242-4490C40F8A5F.MOV' ('application/octet-stream')>)])

Furthermore, as described by this github issue, if I add a filename to the thumbnail MultipartFile, 'thumbnail' then shows up in request.files:

var request = http.MultipartRequest('POST', url)
  ..files.add(http.MultipartFile.fromBytes(
    'thumbnail',
    thumbnail,
    filename: 'placeholder_filename',
  ))
  ..files.add(await http.MultipartFile.fromPath('video', videoPath));

the prints from Flask:

request.form: 
ImmutableMultiDict([])
request.files: 
ImmutableMultiDict([('thumbnail', <FileStorage: 'placeholder_filename' ('application/octet-stream')>), ('video', <FileStorage: 'trim.E892CEB2-DD59-4F24-BB5F-6E8338E8C66B.MOV' ('application/octet-stream')>)])

So, what's the difference between request.files and request.form, and how should I be using them?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source