微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我尝试使用python将mp3文件保存在s3空间上,但文件为空

如何解决我尝试使用python将mp3文件保存在s3空间上,但文件为空

经过几天的研究,我来到这里, 我有一个Django类:问题,管理员可以创建一个问题:他必须为每个项目输入一个标题”和一些“项目” + True或False。我想以mp3文件的形式获取问题的“标题”,所以我使用gTTS(谷歌文本到语音),并且在本地使用时也能正常工作!

 if(sender == Question and kwargs['update_fields'] == None):

    myQuestion = kwargs['instance']
    output = gTTS(myQuestion.title,lang="fr")
    mySound = './media/questionsSound/Question'+str(myQuestion.id)+'.mp3'
    output.save(mySound)

现在,我想将这些mp3文件保存在s3空间上,因为我有许多可以调用它们的应用程序。

所以第一次,我只是试图用我的存储桶的路径替换声音的路径,但是我得到了这个错误消息:

[Errno 22]无效的参数:'https:// [myspaceName] .fra1.digitaloceanspaces.com / [myBucketName] /questionSound/Question95.mp3'

这是第一个对我来说毫无意义的问题,因为存在URL,因此我尝试使用拖放的文件进行处理。 因此,我试图找到一种解决方法,因此决定将文件保存在原始文件./media/questionsSoud...中,然后将其上传到s3空间:

    import boto3
    from boto3 import session
    from botocore.client import Config
    from boto3.s3.transfer import S3Transfer

    session = session.Session()
    client = session.client('s3',region_name='fra1',endpoint_url=settings.AWS_S3_ENDPOINT_URL,aws_access_key_id=settings.AWS_ACCESS_KEY_ID,aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY)
    transfer = S3Transfer(client)

    transfer.upload_file(mySound,settings.AWS_STORAGE_BUCKET_NAME,"testhello.mp3")
    response = client.put_object(ACL='public-read',Bucket=settings.AWS_STORAGE_BUCKET_NAME,Key='testhello.mp3')
    

现在问题不同了:我在我的空间上得到一个文件,但是它是“二进制/八位字节流”类型而不是“音频/ mpeg”类型,并且绝对是空的(我下载并尝试),即使mySound不为空!

谢谢您阅读这个大问题,如果您能帮助我,我将非常感激!

**编辑**

获取非空文件,我删除了put_object()行 但是我仍然获得“二进制/八位字节”内容类型,因此我在GitHub上找到了类似函数upload_file()的内容

    mimetype,_ = mimetypes.guess_type(mySound)
    print(mimetype)
    if mimetype is None:
        raise Exception("Failed to guess mimetype")
    transfer.upload_file(mySound,"testhello.mp3",ExtraArgs={
            "ContentType": mimetype
        })

但是我得到这个错误

upload_file()获得了意外的关键字参数'ExtraArgs'

解决方法

您的put_object()命令未指定要存储的数据,因此它正在创建零长度文件。 尝试使用put_object() 删除行,因为上一行可能已经上传了文件,所以该行应该有效。

我对使用Digital Ocean不熟悉,但是下面是您通常用于S3的代码:

s3_client = boto3.client('s3')

s3_client.upload_file('./file.mp3','mybucket','file.mp3',ExtraArgs={'ACL': 'public-read','Content-Type': 'audio/mpeg'})
,

感谢您的帮助

对于那些也使用DigitalOcean的人来说,最后没什么大不了的,您可以在前端应用程序中调用“ binary / octet-stream”的url,并且确实将其视为音频文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?