【发布时间】:2020-08-11 17:11:08
【问题描述】:
我想让react-dropzone-uploader 与我的 Flask 后端连接,并通过表单将文件(图像)发送到后端。但是我在访问上传的图像时遇到问题。服务器响应:“400 错误请求:浏览器(或代理)发送了此服务器无法理解的请求。” 如何将上传的图片从 React 组件访问到后端?
图片上传请求的Flask路由:
@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);
【问题讨论】:
标签: javascript python reactjs flask