问题描述
经过几天的研究,我来到这里, 我有一个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,并且确实将其视为音频文件