Flask request.files 总是空的
Flask request.files is always empty
我正在发出一个 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 访问这些文件时,值是空字典 ({})。
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"} 但由于某种原因,没有文件进入后端。我发送的所有文件都是真实文件,我已确保发送文件。非常感谢您的帮助!
对于那些最终可能遇到同样问题的人,以下是我解决这个问题的方法。 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)
我正在发出一个 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 访问这些文件时,值是空字典 ({})。
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"} 但由于某种原因,没有文件进入后端。我发送的所有文件都是真实文件,我已确保发送文件。非常感谢您的帮助!
对于那些最终可能遇到同样问题的人,以下是我解决这个问题的方法。 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)