如何让网络应用程序自动下载 mp3 文件 [Google App Engine 上的 Flask]
How to make a web app download mp3 file automatically [Flask on Google App Engine]
我是编码初学者。我想使用 Google Cloud Text to Speech API.
制作一个简单的 Web 应用程序
- 带有文本框的网站
- 你在文本框中输入一个句子,然后点击一个按钮"submit"
- 您可以下载Google云文制作的mp3文件到
演讲 API
我是日本的一名英语老师,所以我希望我的学生使用这个网站来提高他们的英语发音。
首先,我想向您展示我的代码。
我在 Google App Engine 标准环境 Python3.7.
上使用 Flask
这是目录结构。
.
├── app.yaml
├── credentials.json
├── main.py
├── requirements.txt
└── templates
└── hello_form.html
这是main.py。
from flask import Flask
from flask import render_template
from flask import request
from flask import send_file
app = Flask(__name__)
@app.route("/", methods=['POST', 'GET'])
def index():
if request.method == "POST":
text = request.form['text']
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="credentials.json"
from google.cloud import texttospeech
client = texttospeech.TextToSpeechClient()
input_text = texttospeech.types.SynthesisInput(text=text)
voice = texttospeech.types.VoiceSelectionParams(
language_code='en-US',
name='en-US-Standard-C',
ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)
audio_config = texttospeech.types.AudioConfig(
audio_encoding=texttospeech.enums.AudioEncoding.MP3)
response = client.synthesize_speech(input_text, voice, audio_config)
# The response's audio_content is binary.
with open('/tmp/output.mp3', 'wb') as out:
out.write(response.audio_content)
return send_file("/tmp/output.mp3")
else:
return render_template("hello_form.html")
if __name__ == "__main__":
app.run()
这是hello_form.html
<html>
<head>
<title>Sample Web Form</title>
</head>
<body>
<h1>Fill Out This Form</h1>
<form action="/" method="POST">
text: <input type="text" name="text">
<br/>
<input type="submit">
</form>
</body>
</html>
这是requirements.txt。
Flask==1.1.1
future==0.18.2
google-cloud-texttospeech==0.5.0
grpcio==1.26.0
gunicorn
这是app.yaml。
runtime: python37
entrypoint: gunicorn -b :$PORT main:app
当我在 Google App Engine 上部署此应用程序时,它运行良好。但是,我无法直接下载 mp3 文件。我告诉你我的意思。
第 1 步:如果我在浏览器上输入应用程序的 URL(Google Chrome 在 Windows10 上),我会看到这个简单的表单。
第 2 步:我输入文本并按下 "submit"。
第三步:服务器向客户端发送mp3文件,但没有开始下载。
第 4 步:右键单击浏览器并按下 "Save as"。
第五步:下载管理器开始工作并命名mp3文件。
第六步:下载mp3文件到本地下载文件夹。
我不需要第 3 步和第 4 步。当我按下 "submit" 时,我希望浏览器自动启动下载管理器。
你能给我任何信息或建议吗?
提前致谢。
此致 Kazu
感谢 Cameron Roberts,我克服了困难。
将 'as_attachment=True' 传递给 send_file 解决了问题。
但是,现在我面临另一个问题。当我从 PC (Google Chrome) 访问我的 Web 应用程序时,此解决方案非常有效。但是当我从 iPhone(Google Chrome) 访问我的网络应用程序时,下载没有开始。这对我来说是个大问题,因为在 iPhone 上我无法右键单击并进行 "Save as" 操作。
这是截图。
你能给我任何信息或建议吗?
提前致谢。
此致 Kazu
您必须将文件的 'content-disposition' 设置为 'attachment'。使用 Flask,您可以通过传递 'as_attachment=True' 来发送文件来实现此目的。
return send_file("/tmp/output.mp3",as_attachment=True)
烧瓶文档指出:
as_attachment – set to True if you want to send this file with a Content-Disposition: attachment header.
https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file
我是编码初学者。我想使用 Google Cloud Text to Speech API.
制作一个简单的 Web 应用程序- 带有文本框的网站
- 你在文本框中输入一个句子,然后点击一个按钮"submit"
- 您可以下载Google云文制作的mp3文件到 演讲 API
我是日本的一名英语老师,所以我希望我的学生使用这个网站来提高他们的英语发音。
首先,我想向您展示我的代码。 我在 Google App Engine 标准环境 Python3.7.
上使用 Flask这是目录结构。
.
├── app.yaml
├── credentials.json
├── main.py
├── requirements.txt
└── templates
└── hello_form.html
这是main.py。
from flask import Flask
from flask import render_template
from flask import request
from flask import send_file
app = Flask(__name__)
@app.route("/", methods=['POST', 'GET'])
def index():
if request.method == "POST":
text = request.form['text']
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="credentials.json"
from google.cloud import texttospeech
client = texttospeech.TextToSpeechClient()
input_text = texttospeech.types.SynthesisInput(text=text)
voice = texttospeech.types.VoiceSelectionParams(
language_code='en-US',
name='en-US-Standard-C',
ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)
audio_config = texttospeech.types.AudioConfig(
audio_encoding=texttospeech.enums.AudioEncoding.MP3)
response = client.synthesize_speech(input_text, voice, audio_config)
# The response's audio_content is binary.
with open('/tmp/output.mp3', 'wb') as out:
out.write(response.audio_content)
return send_file("/tmp/output.mp3")
else:
return render_template("hello_form.html")
if __name__ == "__main__":
app.run()
这是hello_form.html
<html>
<head>
<title>Sample Web Form</title>
</head>
<body>
<h1>Fill Out This Form</h1>
<form action="/" method="POST">
text: <input type="text" name="text">
<br/>
<input type="submit">
</form>
</body>
</html>
这是requirements.txt。
Flask==1.1.1
future==0.18.2
google-cloud-texttospeech==0.5.0
grpcio==1.26.0
gunicorn
这是app.yaml。
runtime: python37
entrypoint: gunicorn -b :$PORT main:app
当我在 Google App Engine 上部署此应用程序时,它运行良好。但是,我无法直接下载 mp3 文件。我告诉你我的意思。
第 1 步:如果我在浏览器上输入应用程序的 URL(Google Chrome 在 Windows10 上),我会看到这个简单的表单。
第三步:服务器向客户端发送mp3文件,但没有开始下载。
第 4 步:右键单击浏览器并按下 "Save as"。
第五步:下载管理器开始工作并命名mp3文件。
第六步:下载mp3文件到本地下载文件夹。
我不需要第 3 步和第 4 步。当我按下 "submit" 时,我希望浏览器自动启动下载管理器。
你能给我任何信息或建议吗?
提前致谢。
此致 Kazu
感谢 Cameron Roberts,我克服了困难。
将 'as_attachment=True' 传递给 send_file 解决了问题。
但是,现在我面临另一个问题。当我从 PC (Google Chrome) 访问我的 Web 应用程序时,此解决方案非常有效。但是当我从 iPhone(Google Chrome) 访问我的网络应用程序时,下载没有开始。这对我来说是个大问题,因为在 iPhone 上我无法右键单击并进行 "Save as" 操作。
这是截图。
你能给我任何信息或建议吗?
提前致谢。
此致 Kazu
您必须将文件的 'content-disposition' 设置为 'attachment'。使用 Flask,您可以通过传递 'as_attachment=True' 来发送文件来实现此目的。
return send_file("/tmp/output.mp3",as_attachment=True)
烧瓶文档指出:
as_attachment – set to True if you want to send this file with a Content-Disposition: attachment header.
https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file