Javascript: форма ввода аудио в ссылку для загрузки аудио?

Это странный вопрос, но какое-то время он меня сбивал с толку.

У меня есть аудиовход:

<input required type = "file" id = "inputAudio" accept = "audio/*" onchange = "downloadLink(this);">

Когда вы отправляете аудио, я бы хотел добавить ссылку для загрузки на этот элемент:

<a id = "blah">Download Audio</a>

Я пробовал делать такие странные вещи, как это:

function downloadLink(element) {
    var file = element.files[0];
    var reader = new FileReader();
    reader.onload = function(e) {
        var data = file.type + ";charset=utf-8," + encodeURIComponent(e.target.result);
        var link = document.getElementById("blah");
        link.href = "data:" + data;
        link.download = "someName." + file.name.split(".").pop();
    };
    reader.readAsDataURL(file);
}

Однако вышеуказанное вызывает ошибку загрузки в Chrome.

Вот HTML-файл для тестирования:

<!DOCTYPE html>
<html>
    <head>
        <title>Weird Problem</title>
        <script>
        function downloadLink(element) {
            var file = element.files[0];
            var reader = new FileReader();
            reader.onload = function(e) {
                var data = file.type + ";charset=utf-8," + encodeURIComponent(e.target.result);
                var link = document.getElementById("blah");
                link.href = "data:" + data;
                link.download = "someName." + file.name.split(".").pop();
            };
            reader.readAsDataURL(file);
        }
        </script>
    </head>
    <body>
        <input required type = "file" id = "inputAudio" accept = "audio/*" onchange = "downloadLink(this);">
        <a id = "blah">Download Audio</a>
    </body>
</html>

Обновлено: Я только что заметил, что вы можете вставлять файлы HTML:

function downloadLink(element) {
	var file = element.files[0];
	var reader = new FileReader();
	reader.onload = function(e) {
		var data = file.type + ";charset=utf-8," + encodeURIComponent(e.target.result);
		var link = document.getElementById("blah");
		link.href = "data:" + data;
		link.download = "someName." + file.name.split(".").pop();
	};
	reader.readAsDataURL(file);
}
<!DOCTYPE html>
<html>
	<head>
		<title>Weird Problem</title>
	</head>
	<body>
		<input required type = "file" id = "inputAudio" accept = "audio/*" onchange = "downloadLink(this);">
		<a id = "blah">Download Audio</a>
	</body>
</html>

Любая помощь была бы фантастической!

повторно кодировать не нужно, ридер уже выдает данные в base64

nullqube 11.03.2018 08:36

также github.com/eligrey/FileSaver.js

nullqube 11.03.2018 08:37

@nullqube, даже без использования encodeURIComponent, выдает ту же ошибку, загрузка не удалась. Я действительно не хочу использовать для этого какие-либо внешние библиотеки.

MysteryPancake 11.03.2018 08:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
556
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хитрость в том, что вы должны просто превратить его в ObjectURL, а затем, как следует из названия, вы можете использовать его как URL-адрес для href, Итак, теперь протестировано на Safari, Chrome, FireFox:

var file = element.files[0];
var link = document.getElementById("blah");
link.href = window.URL.createObjectURL(file);
link.download = "someName." + file.name.split(".").pop();

вот он работает на PlayCode.io

Эта версия работает с файлами MP3, но не работает с файлами WAV.

MysteryPancake 11.03.2018 09:09

Я просто тестировал его с помощью файла .wav из music.helsinki.fi/tmt/opetus/uusmedia/esim/index-e.html и отлично работал.

nullqube 11.03.2018 09:24

Какой браузер вы используете? Я использую Chrome и каждый раз получаю сообщение об ошибке при загрузке

MysteryPancake 11.03.2018 09:38

Сафари. и да, вы правы. Он не работает на хроме. так позволь мне проверить

nullqube 11.03.2018 09:46

Другие вопросы по теме