【发布时间】:2021-06-08 18:08:53
【问题描述】:
我正在尝试将文件从 JS 前端发送到 Flask 后端。 但是我的烧瓶后端似乎没有收到任何文件。 它在进入烧瓶后端 HTML 页面并手动提交时有效,但我希望前端将文件发送到后端。
这是有问题的javascript:
function send() {
const formData = new FormData();
const files = document.getElementById("file");
formData.append("file", files.files[0]);
const requestOptions = {
headers: {
"Content-Type": "multipart/form-data",
},
mode: "no-cors",
method: "POST",
files: files.files[0],
body: formData,
};
console.log(requestOptions);
fetch("http://localhost:5000/upload", requestOptions).then(
(response) => {
console.log(response.data);
}
);
}
export default function App() {
return (
<div className="App" id="App">
<header className="App-header">
<Button variant="outlined" component="label" size="large">
Load Audio
<input
id="file"
type="file"
onChange={send}
hidden
/>
</Button>
</header>
</div>
);
}
这是用于处理传入请求的烧瓶 python 脚本:
@app.route("/upload", methods=["GET", "POST"])
def upload():
if request.method == 'POST':
if 'file' not in request.files:
print(1)
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
print(2)
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
print(3)
filename = secure_filename(file.filename)
session["id"] = filename
file.save(os.path.join('UPLOAD', filename))
return redirect(url_for('uploaded',
filename=filename))
return render_template('upload.html')
它打印 1,所以没有找到文件。
如果有用的话,这里是print(request.headers)的调试:
Host: localhost:5000
Connection: keep-alive
Content-Length: 412313
Sec-Ch-Ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
Content-Type: multipart/form-data
Accept: */*
Origin: http://localhost:3000
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: empty
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
我在网上阅读了很多关于如何在这种情况下上传文件的信息,但我无法让它工作。 很高兴能得到一些帮助!
【问题讨论】:
标签: javascript python flask frontend backend