Search code examples
pythonflaskflask-restfulangular8

Flask request.files is always empty


I am making a POST request to send a JSON object with keys containing files. An example of what I send to the backend is:

export interface PosInputFiles {
org: string;
year_month: string;
in_master_file: File;
iv_file?: File;
sales_file?: File;
recv_file?: File;
transfer_file?: File;
adjust_file?: File;
pcount_file?: File;
gift_file?: File;
xrate?: string;

}

My POST request looks like:

  generateMaster(args: PosInputFiles) {
return this.http.post('http://localhost:5000/api', args, { headers: this.headers});

}

When I try to access these files from request.json, the values are an empty dict ({}).

try:
        org = request.json['org']
        year_month = request.json['year_month']
        in_master_file = request.json['in_master_file']
        iv_file = None if 'iv_file' not in request.json else request.json['iv_file']
        sales_file = None if 'sales_file' not in request.json else request.json['sales_file']
        recv_file = None if 'recv_file' not in request.json else request.json['recv_file']
        transfer_file = None if 'transfer_file' not in request.json else request.json['transfer_file']
        adjust_file = None if 'adjust_file' not in request.json else request.json['adjust_file']
        pcount_file = None if 'pcount_file' not in request.json else request.json['pcount_file']
        gift_file = None if 'gift_file' not in request.json else request.json['gift_file']
        xrate = None if 'xrate' not in request.json else request.json['xrate']
    except:
        return { "post" : "failed" }

    print(in_master_file)
    print(len(request.files))

    return { "post": "success"}

Then I tried sending only one file and made sure len(request.json) == 0 through POSTMan and my frontend (Angular8). However, len(request.files) is also 0 and every time I try to access something, there is 400 error. My POST request is successful as I always print {"post", "success"} but for some reason, no files make it to the backend. All my files sent are real files and I have made sure that I am sending the file. Thank you so much for your help!


Solution

  • For those who might have the same problem eventually, here's how I solved this issue. Flask doesn't recognize files that aren't of FormData type so that's why I could only access JSON. Thus, I had to append all my files to a FormData variable.

    generateMaster(submittedFiles: PosInputFiles) {
    const formData: FormData = new FormData();
    Object.keys(submittedFiles).forEach(key => {
      if (submittedFiles[key] instanceof File) {
        formData.append(key, submittedFiles[key], submittedFiles[key].name);
      } else {
        formData.append(key, new File([], submittedFiles[key]), submittedFiles[key].name);
      }
    })
    return this.http.post('http://localhost:5000/api', formData, { headers: this.headers});
    

    }

    Then backend will finally recognize the files. In order to get other string data, and floats, I stored those values as the filename and could access them as such.

     def post(self):
        # Initilize arguments
        org = request.files.get('org').filename
        year_month = request.files.get('year_month').filename
        in_master_file = request.files.get('in_master_file')
        iv_file = request.files.get('iv_file')
        sales_file = request.files.get('sales_file')
        ...
        xrate = None if 'xrate' not in request.files else float(request.files.get('xrate').filename)