【问题标题】:I try to save a mp3 file on s3 space with python but got empty file我尝试使用 python 在 s3 空间上保存一个 mp3 文件但得到了空文件
【发布时间】:2021-02-14 22:36:28
【问题描述】:

在对这个主题进行了几天的研究后,我来到这里, 我有一个 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, settings.AWS_STORAGE_BUCKET_NAME, "testhello.mp3", ExtraArgs={
            "ContentType": mimetype
        })

但我得到了这个错误

upload_file() 得到了一个意外的关键字参数“ExtraArgs”

【问题讨论】:

    标签: python django amazon-s3 boto3 gtts


    【解决方案1】:

    您的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'})
    

    【讨论】:

    • 你是对的,但我添加了这一行以将文件设为公开,我尝试不使用 put_object() 但即使我想要一个私有文件,它仍然是一个“二进制/八位字节流”内容类型,我想要一个“音频/mpeg”
    • 我已更新答案以符合这些要求。
    【解决方案2】:

    感谢您的帮助

    对于同样使用DigitalOcean的人来说,这也没什么大不了的,你可以在你的前端应用中调用“binary/octet-stream”的url,它确实被认为是一个音频文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多