Колба request.files всегда пуста - PullRequest
0 голосов
/ 22 июня 2019

Я делаю запрос POST для отправки объекта JSON с ключами, содержащими файлы. Пример того, что я отправляю на сервер:

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;

}

Мой POST-запрос выглядит так:

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

}

Когда я пытаюсь получить доступ к этим файлам из request.json, значения представляют собой пустой 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"}

Затем я попытался отправить только один файл и удостоверился, что len (request.json) == 0 через POSTMan и мой интерфейс (Angular8). Однако len (request.files) также равно 0, и каждый раз, когда я пытаюсь получить доступ к чему-либо, возникает ошибка 400. Мой POST-запрос выполнен успешно, так как я всегда печатаю {"post", "success"}, но по какой-то причине файлы не попадают в бэкэнд. Все мои отправленные файлы являются реальными файлами, и я убедился, что отправляю файл. Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 22 июня 2019

Для тех, у кого может возникнуть та же самая проблема, вот как я решил эту проблему.Flask не распознает файлы, не относящиеся к типу FormData, поэтому я мог получить доступ только к JSON.Таким образом, мне пришлось добавить все мои файлы в переменную FormData.

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});

}

Тогда бэкэнд, наконец, распознает файлы.Для того, чтобы получить другие строковые данные и плавающие объекты, я сохранил эти значения в качестве имени файла и мог обращаться к ним как таковой.

 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)
...