You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:10:25