基于Flask的多图片上传及JSON列表存储问题排查
解决你的Flask多图片上传两个问题
让我们一步步来解决你遇到的两个问题:
问题1:JSON仅存储单个上传文件名
问题出在哪?
看你的代码,虽然你循环保存了所有上传的文件,但最后调用storyTimeMap的时候,你传的是f.filename——而这个f是循环结束后的最后一个文件对象,所以自然只把最后一个文件名存进了JSON。
怎么修复?
你需要先把所有上传的文件名收集到一个列表里,再把这个列表传给storyTimeMap。修改后的代码如下:
@app.route("/textupload/", methods=['GET','POST']) def text(): if request.method == "POST": if 'filename' not in request.files: flash("No Image Uploaded, Try Again") return redirect(request.url) # 先收集所有有效的文件名 uploaded_files = [] for f in request.files.getlist("filename"): if f.filename == '': flash("Skipping empty file selection") continue if allowed_file(f.filename): save_path = os.path.join(app.config['UPLOAD_FOLDER'], f.filename) f.save(save_path) uploaded_files.append(f.filename) print(f"Uploaded file: {f.filename}") if not uploaded_files: flash("No valid files were uploaded") return redirect(request.url) if "Title" in request.form: # 把文件名列表传给storyTimeMap story_title = request.form["Title"] data[story_title] = storyTimeMap(request.form, uploaded_files) # 写入JSON文件 with open('/var/www/FlaskApp/FlaskApp/newstories.json', 'w') as outfile: json.dump(data, outfile) flash("Your Story Has Been Posted!") return render_template("main.html", data=data, filename=uploaded_files) return render_template("textupload.html", data=data)
然后更新storyTimeMap函数,直接接收文件名列表:
def storyTimeMap(form, filenames): storyTime = { "Title": form["Title"], "ParaOne": form["StoryPara"], "ParaTwo": form["StoryParaTwo"], "ParaThree": form["StoryParaThree"], "ParaFour": form["StoryParaFour"], "Quote": form["Quote"], "schoolSelect": form["schoolSelect"], "filename": filenames # 直接赋值列表,不需要split } return storyTime
这样修改后,JSON里就会存储所有上传的文件名列表了。
问题2:storyTimeMap里的.split()用法正确吗?
完全不正确。
原来的filename.split()是把单个文件名按空格分割成字符串列表——如果文件名里没有空格,它会返回一个只有一个元素的列表(比如["HomeFuels-Direct-truck-200x200.png"]),但这只是巧合。如果文件名里有空格(比如"my photo.png"),split会把它拆成["my", "photo.png"],这显然不是你想要的。
现在我们直接传入文件名列表,所以直接赋值即可,不需要任何split操作。
额外提醒
- 你代码里有个拼写错误:
return refirect(request.url)应该是return redirect(request.url),记得修正这个小bug! - 确保
UPLOAD_FOLDER目录存在且你的应用有写入权限,否则文件保存会失败。 - 确认
allowed_file函数正确限制了文件类型,防止上传不安全的文件。
内容的提问来源于stack exchange,提问作者user9101070
相关产品推荐
相关产品推荐

