javascript - 连接 React Dropzone Uploader 和 Flask
问题描述
我想让react-dropzone-uploader与我的 Flask 后端连接,并通过表单将文件(图像)发送到后端。但是我在访问上传的图像时遇到问题。服务器响应:“400 错误请求:浏览器(或代理)发送了此服务器无法理解的请求。” 如何将上传的图片从 React 组件访问到后端?
图片上传请求的烧瓶路由:
@app.route("/sell", methods=['GET', 'POST'])
def sell():
if session.get("user_id") is None:
return render_template("register.html")
if request.method == 'POST':
print(request)
try:
brand = request.form.get("brand")
model = request.form.get("model")
condition = request.form.get("condition")
gender = request.form.get("gender")
year = request.form.get("year")
movement = request.form.get("movement")
price = request.form.get("price")
description = request.form.get("description")
created = datetime.now().isoformat()
with sql.connect("mydb.db") as con:
cur = con.cursor()
cur.execute("INSERT INTO items (brand, model, condition, gender, year, movement, price, description, created, item_owner) VALUES (?,?,?,?,?,?,?,?,?,?)", (brand, model, condition, gender, year, movement, price, description, created, session["user_id"]))
file_entry = query_db('SELECT last_insert_rowid()')
image = request.files['file']
# flask image upload procedure from https://pythonise.com/series/learning-flask/flask-uploading-files
if image:
# Check if the image has a name
if image.filename == "":
return render_template("/sell.html", msg = "Selected image has no name")
if allowed_image(image.filename):
filename = ''.join(random.choices(string.ascii_lowercase + string.ascii_uppercase + string.digits, k=8)) + secure_filename(image.filename)
image.save(os.path.join(app.config["IMAGE_UPLOADS"], filename))
cur.execute("INSERT INTO images (item, user, date, path) VALUES (?,?,?,?)", (1, session["user_id"], created, "/static/images/{}".format(filename)))
con.commit()
return render_template("watch.html", item_id = 14)
con.close()
反应代码
import React from "react";
import ReactDOM from "react-dom";
import 'react-dropzone-uploader/dist/styles.css';
import Dropzone from 'react-dropzone-uploader';
const ImageAudioVideo = () => {
const getUploadParams = ({ meta }) => {
const url = 'http://127.0.0.1:5000/sell'
return { url, meta: { fileUrl: `${url}/${encodeURIComponent(meta.name)}` } }
}
const handleChangeStatus = ({ meta }, status) => {
console.log(status, meta)
}
const handleSubmit = (files, allFiles) => {
console.log(files.map(f => f.meta))
allFiles.forEach(f => f.remove())
}
return (
<Dropzone
getUploadParams={getUploadParams}
onChangeStatus={handleChangeStatus}
onSubmit={handleSubmit}
accept="image/*,audio/*,video/*"
inputContent={(files, extra) => (extra.reject ? 'Image, audio and video files only' : 'Drag Files')}
styles={{
dropzoneReject: { borderColor: 'red', backgroundColor: '#DAA' },
inputLabel: (files, extra) => (extra.reject ? { color: 'red' } : {}),
}}
/>
)
}
<ImageAudioVideo />
const rootElement = document.getElementById("react-root");
ReactDOM.render(<ImageAudioVideo />, rootElement);
解决方案
您的服务器可能未配置为响应 CORS 请求。
react-dropzone-uploader 在上传之前执行一个 OPTIONS 请求。您可以使用Flask CORS模块简单地启用它。
只需使用应用程序初始化 CORS 模块即可使用 CORS 装饰所有路由,它应该可以工作。
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
推荐阅读
- c# - How to get request payload using Titanium Web Proxy in C#?
- theorem-proving - 如何使用 LEAN 证明命题逻辑中的两个陈述?
- javascript - When is an elementHandle not an elementHandle
- java - TestNG/Maven Encoding issue
- python - 如何在大量非空格字符后添加换行符?
- postgresql - 如何检查两列中至少一列是否填充了数据?
- c++ - 在 Clion CMake 中包含 Eigen 库的问题
- php - Laravel 迁移 SQLSTATE[42000]:语法错误或访问冲突:1064
- flutter - FutureBuilder 一次又一次地颤振构建应用程序?
- ios - UIViewPropertyAnimator 停止重复