Аудиофайлы POST HTML5 на сервер
В настоящее время я внедряю веб-приложение, и я хочу, чтобы пользователи записывали некоторый звук, а затем я хочу кнопку отправки, чтобы ПОСТ mp3 файл, записанный на сервер.
Основной маршрут моего сервера (Flask) '/'
ожидает запроса POST:
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == "GET":
return render_template('index.html', request="GET")
else:
print request.files
print request.form
print request.form['file']
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
handle_file(file)
return render_template('index.html', request="POST")
Вот мой код JS:
Jsfiddle
Здесь есть два основных вопроса:
1) Когда я загружаю mp3 файл после записи, он не может быть открыт медиаплеером. Кажется, я делаю что-то неправильно, просто записывая звук.
2) Когда я print request.form
на моем сервере после получения запроса POST, я получаю только это:
ImmutableMultiDict([('file', u'')])
И print request.form['file']
возвращает пустую строку.
Почему это происходит? Что-то не так с запросом POST.
Наконец, я хочу иметь возможность декодировать строку, которую я отправляю, чтобы преобразовать обратно в mp3. Как это сделать?
Примечание: Ничто из этого не должно оставаться прежним. Задача состоит в том, чтобы записать звук, а затем отправить его на сервер. Если есть более эффективный способ сделать это, любые советы приветствуются. Кроме того, мне все равно, будет ли файл wav или mp3.
Ответы
Ответ 1
Примечание. Этот ответ рассматривает только текущие реализации как в Chrome, так и в Firefox. Все это может измениться в ближайшее время.
Я не уверен, что что-то не так в вашем серверном коде, но не отправляйте двоичные данные в виде строки. Вместо этого используйте FormData для отправки его как multipart (вы получите 30% данных + целостность).
Кроме того, кажется, что в вашем коде MediaRecorder вы завершаете файл в каждом событии dataavailable
. Обычно это не то, что вы хотите.
В настоящее время ни один браузер не поддерживает запись как mp3 изначально.
var mimes = ['mpeg', 'mpeg3', 'x-mpeg3', 'mp3', 'x-mpeg']
console.log(mimes.some(m=>MediaRecorder.isTypeSupported('audio/'+m)));
Ответ 2
Попробуйте преобразовать аудиокабель в Base64 и отправить строку base64 на сервер.
function submit(blob) {
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
var fd = new FormData();
base64data = reader.result;
fd.append('file', base64data, 'audio.mp3');
$.ajax({
type: 'POST',
url: '/',
data: fd,
cache: false,
processData: false,
contentType: false,
enctype: 'multipart/form-data'
}).done(function(data) {
console.log(data);
});
}
}
Теперь преобразуем base64 String в двоичный поток на вашем сервере.
Создайте дополнительную информацию о том, как декодировать Base64 в python checkout этого сообщения. Python base64 декодирует