首页 > 编程问答 >我正在尝试使用 Streamlit 应用程序在 s3 上上传文件,但收到错误文件名必须是路径

我正在尝试使用 Streamlit 应用程序在 s3 上上传文件,但收到错误文件名必须是路径

时间:2024-08-02 16:03:50浏览次数:12  
标签:python amazon-s3 streamlit

我尝试打印路径并发现 Streamlit 暂时存储文件,但我无法获取路径 临时文件已存储

我无法获取文件的路径。我什至尝试打印它,但是 没有路径。我之前尝试通过指定文件路径来上传 本地机器并且代码运行良好

import streamlit as st
import requests
from dotenv import load_dotenv
import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError,ClientError
import io
import os
import time

def upload_to_s3(file_path,bucket_name,object_name=None):
    
    s3=boto3.client("s3")
    if object_name is None:
        object_name=file_path
    try:
     s3.upload_file(file_path,bucket_name,object_name)
    except ClientError as e:
        print("Client error occured {e}")


def main():
    bucket="shellkode1111"
    st.set_page_config(page_title="apptech",layout="wide")
    st.title("Apple")
    uploaded_file=st.file_uploader("Upload file",type=["mp4"])
    s3=boto3.client("s3")
    sts=boto3.client("sts")
    response = s3.head_bucket(Bucket="shellkode1111")
    try:
        s3.upload_file(uploaded_file,bucket,uploaded_file.name)
    except ClientError as e:
        print("Client Error occured {e}")
    print(response)
    bucket="shellkode1111"
    print("------------------------------")
    print(uploaded_file)
    print("----------------------------------")
    print("Working1")
    if(uploaded_file):
        print("Working")
        response=upload_to_s3(uploaded_file,bucket,uploaded_file)


if __name__== "__main__":
    main()


这个错误信息“文件名必须是路径”表明你在尝试将 UploadedFile 对象直接传递给 s3.upload_file 函数,而该函数期望的是一个字符串形式的文件路径。

要解决这个问题,你需要先将上传的文件保存到一个临时位置,然后将该临时文件的路径传递给 s3.upload_file 函数。以下是如何修改你的代码来实现这个功能:

import streamlit as st
import boto3
from botocore.exceptions import ClientError
import os
import tempfile

def upload_to_s3(file_object, bucket_name, object_name=None):
    """
    将文件上传到 S3

    Args:
        file_object (UploadedFile): 要上传的文件对象。
        bucket_name (str): S3 存储桶名称。
        object_name (str, optional): 对象在 S3 中的名称。 
                                     如果未提供,将使用上传文件的原始名称。

    Returns:
        bool: 上传成功返回 True,否则返回 False。
    """

    s3 = boto3.client("s3")
    if object_name is None:
        object_name = file_object.name

    # 使用 tempfile 创建一个安全的临时文件
    with tempfile.NamedTemporaryFile(delete=False) as temp_file:
        temp_file.write(file_object.read())
        temp_file_path = temp_file.name

        try:
            s3.upload_file(temp_file_path, bucket_name, object_name)
            return True
        except ClientError as e:
            print(f"Client Error occured: {e}")
            return False
        finally:
            #  确保删除临时文件
            os.remove(temp_file_path)


def main():
    bucket = "shellkode1111"
    st.set_page_config(page_title="apptech", layout="wide")
    st.title("Apple")
    uploaded_file = st.file_uploader("Upload file", type=["mp4"])

    if uploaded_file:
        if upload_to_s3(uploaded_file, bucket):
            st.success(f"File '{uploaded_file.name}' uploaded successfully to S3 bucket '{bucket}'.")
        else:
            st.error(f"Error uploading file '{uploaded_file.name}' to S3.")


if __name__ == "__main__":
    main()

这个代码做了以下几件事:

  1. 使用 tempfile.NamedTemporaryFile 创建临时文件 : 这个函数会在安全的位置创建一个临时文件,并将上传文件的内容写入其中。它还提供了临时文件的路径 ( temp_file_path ),以便你可以将其传递给 s3.upload_file
  2. 将临时文件路径传递给 s3.upload_file : 在 upload_to_s3 函数中,我们现在将 temp_file_path 传递给 s3.upload_file 来上传文件。
  3. 删除临时文件 : 在 finally 块中,我们使用 os.remove(temp_file_path) 删除临时文件,以确保不会留下任何残留文件。
  4. 改进错误处理 : 代码现在会捕获 ClientError 异常,并打印更详细的错误信息,帮助你调试上传过程中可能出现的任何问题。

通过这些更改,你的代码应该能够成功将文件上传到 S3。

标签:python,amazon-s3,streamlit
From: 78823916

相关文章

  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • Python 警告:重试(重试(总计=4,连接=无,读取=无,重定向=无,状态=无))
    我正在尝试pipinstall--upgradepip并保持收到此错误:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ProxyError('Cannotconnecttoproxy.',NewConnectionError('<......
  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 为什么我在 Python 中的 Skip-Gram 实现会产生不正确的结果?
    我正在使用Python实现Word2Vec的Skip-Gram模型。然而,正如生成的嵌入及其可视化所示,我的模型似乎无法正常工作。这是嵌入的3D图的示例,它显示单词聚集在一起并重叠,因此很难区分它们:我怀疑问题在于我的实现而不是绘图函数。importnumpyasnpfromnltk.corpusimpor......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • Python 基础教学 - 开发规范
    Python基础教学-开发规范一、引言在Python编程中,遵循良好的开发规范是编写高质量、可维护代码的关键。本文将为您详细介绍Python开发中的一些重要规范,帮助您养成良好的编程习惯。二、代码布局缩进使用4个空格进行缩进,避免使用制表符。示例:ifTrue:p......
  • Python基础学习笔记(一)
    文章目录一、下载Python二、变量三、数据类型四、运算符五、语句六、容器类型七、函数function八、常用API九、面向对象类的创建:创建对象:实例成员:实例方法:类成员:静态方法:十、三大特征:封装、继承、多态十一、六大原则:Python基础学习笔记(二)一、下载Python官网:https......
  • 随机森林的可解释性分析(含python代码)
    随机森林的可解释性分析1.引言可解释性的重要性2.随机森林的原理2.1基本原理:2.2随机森林的实现3.随机森林的可解释性分析3.1特征重要性3.2特征重要性3.3SHAP值3.4部分依赖图(PDP)3.5交互特征效应3.6变量依赖图4.结论5.参考文献1.引言在机器学习领域,随机森林......
  • 【Python】模块
    1.模块的概念Python中有一种方法可以把定义放在一个文件里面,并在脚本或者解释器的交互实例中使用它们。这样的文件被称作Python的模块。2.自定义模块在Python中,自定义模块有两个作用,一个作用是规范代码,让代码更容易阅读;另一个作用是方便其他程序使用已经编写好的代码,提高开......
  • 计算机毕业设计-基于python的房屋租赁系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......