使用Hugging face预设的streamlit框架搭建网站时遇到问题

如题,项目本身结构如下:

img

设想中,用户填写完数据后,点击“提交”按钮,系统先判定表单数据是否有空的,如果有就弹出一个“请完整填写”的弹窗。没有的话,就把用户上传的图片重命名为用户填写的小码王id(如用户在ID处填写114514,就把用户上传的图片重命名为114514.png),将图片保存在./image目录下,弹出弹窗“提交成功!”然后清空表单数据。

然而在实际情况下,表单数据能够成功提交,但图片却无法存储,排查了几遍没有发现问题所在。

以下是文件app.py源码:

import streamlit as st
import os

def main():
    st.set_page_config(page_title="小码王个人主页背景图托管", page_icon="🌟")

    st.markdown(
        """
        <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
            font-family: 'Roboto', sans-serif;
        }
        .container {
            max-width: 800px;
            margin: 80px auto 30px;
            padding: 20px;
        }
        header {
            background-color: #FFA500;
            color: orange;
            text-align: center;
            padding: 10px;
            position: fixed;
            width: 100%;
            top: 0;
            z-index: 1;
        }
        main {
            margin-top: 80px;
            padding: 20px;
            background-color: white;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
        }
        .mdui-card {
            border-radius: 5px;
            border: none;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            margin: 10px 0;
            overflow: hidden;
        }
        .mdui-card-content {
            padding: 20px;
        }
        .mdui-textfield {
            margin-top: 15px;
        }
        .mdui-textfield-label {
            font-size: 14px;
        }
        .mdui-textfield-input {
            font-size: 16px;
        }
        .mdui-btn {
            background-color: #3f51b5;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        </style>
        """,
        unsafe_allow_html=True
    )

    st.header("小码王个人主页背景图托管")

    user_id = st.text_input("第一步:填写您的小码王社区ID", key="user_id")
    uploaded_file = st.file_uploader("第二步:上传您的个人主页背景图(建议图片尺寸:1920×1080)", type=["jpg", "png"])
    if st.button("提交"):
        if user_id == "":
            st.warning("请填写小码王ID")
        elif uploaded_file is None:
            st.warning("请选择要上传的图片")
        else:
            image_name = f"{user_id}.png"
            absolute_image_path = os.path.join(os.getcwd(), "image", image_name)
            os.makedirs(os.path.dirname(absolute_image_path), exist_ok=True)
            with open(absolute_image_path, "wb") as f:
                f.write(uploaded_file.getbuffer())
            
            st.success("提交成功!")
            user_id = ""
            uploaded_file = None

if __name__ == "__main__":
    main()

项目地址:https://huggingface.co/spaces/lsxk/1/

【以下回答由 GPT 生成】

根据提供的源代码,有几个可能导致图片无法保存的原因:

  1. 缺少必要的库:代码中使用了一个image对象,它可能是一个类似PIL或OpenCV的图像对象。请确保您的代码中导入了正确的库,并正确地创建了image对象。

  2. 图片保存路径错误:根据代码,图片被保存到了./image目录下,但是没有检查该目录是否存在,也没有检查该目录是否具有写入权限。可以通过使用os.makedirs('./image', exist_ok=True)来创建目录,以确保目录存在。

  3. 保存图片的代码缺失:根据代码,将上传的图片对象保存到指定路径的代码被注释掉了,这也是导致图片无法保存的原因之一。请检查并取消相关注释,或添加正确的保存图片的代码。

  4. image.save()方法使用错误:如果image对象是类似PIL或OpenCV的图像对象,那么image.save()方法用于保存图像。但根据代码,image.save()方法的调用是被注释掉的,所以也有可能是导致问题的原因之一。请取消相关注释,或根据具体的图像对象修正保存图片的代码。

  5. 文件路径问题:请确保在调试时,image对象确实包含了一张有效的图片,而且image_path应该是指向正确的文件路径。可以使用st.write(image)打印image变量的值来检查是否包含有效的图片。

综上所述,为了解决图片无法保存的问题,可以按照以下步骤进行操作:

  1. 确保已正确导入并创建了image对象。
  2. 添加如下代码以创建图片保存目录:
os.makedirs('./image', exist_ok=True)
  1. 检查并取消相关保存图片代码的注释。
  2. 确保image对象包含有效的图片,而且image_path指向了正确的文件路径。
  3. 重新运行代码,检查问题是否已经解决。

如果您还遇到困难或问题,请提供更多的代码和错误信息,以便更好地帮助您解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^