Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413

Прослушать mp3 по ссылке

26.09.2017, 08:21. Показов 3132. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги! Какой самый лучший способ прослушать mp3 при нажатии на ссылку (не скачивать)?

MP3 файлы хранятся в файловой шаре (\\virtualMachine\Records\111.mp3).
Вставить напрямую в тег не получится, файл не будет воспроизводиться:
HTML5
1
<audio src='file:\\virtualMachine\Records\111.mp3' autoplay controls controlsList='nodownload'></audio>
Предполагаю при клике на ссылку "Прослушать запись" отправлять запрос Home/GetRecord(Guid Id), в этом методе копировать запись в wwwroot/Record и возвращать на клиент src до файла.

Здесь возникло пара вопросов.
1. Как скопировать файл из шары в wwroot?
Думаю что то подобное нужно использовать
C#
1
 using (var fileStream = new FileStream(Path.Combine(callsFolder, fileName), FileMode.Create))
, но гугл упорно показывает примеры с UploadFiles(IFormFile file) - не то что нужно
2.Можно ли в
HTML5
1
<audio></audio>
передавать сразу поток, без копирования файла в wwwroot/Record? Если да то не будет ли этот вариант дольше по времени работать?
PS: Спасибо за отзывчивость

Добавлено через 2 минуты
Было бы удобно считать файл в массив байтов, либо поток и передать клиенту, но как скормить тегу <audio> byte[] или streem?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2017, 08:21
Ответы с готовыми решениями:

Необходимость запустить по ссылке MediaPlayer для воспроизведения MP3 с моего сайта
Я только учусь создавать WEB страницы и у меня возникла необходимость запустить по ссылке MediaPlayer для воспроизведения MP3 с моего...

Как воспроизвести MP3 файл по ссылке?
Здравствуйте! Имеется ссылка на mp3 файл &quot;http://sait.ru/file.mp3&quot;. Нужно сделать, что бы по нажатию на кнопку этот файл...

Как сделать чтобы файл mp3 загружался по ссылке
Не могу понять как сделать чтобы списком передавались url на файлы типо ...

43
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
27.09.2017, 07:57
Студворк — интернет-сервис помощи студентам
Alex_trader, мне кажется, что было бы проще, если бы вы в представлении передавали ссылку на WebAPI в теге <audio>, чтобы браузер сам сходил за файлом. А так, получается, что вы пустую работу делаете пиная файл между сервисами как мячик для пин-понга. mp3 - файл не маленький.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 09:33  [ТС]
Usaga,
Цитата Сообщение от Alex_trader Посмотреть сообщение
Usaga, Спасибо за помощь! Разобрался
Нет не разобрался...
через Get запрос с браузера напрямую в WebApi - работает ,но нужно чтобы работало через обращение к asp контроллеру, ошибку выдаёт 416

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Alex_trader, мне кажется, что было бы проще, если бы вы в представлении передавали ссылку на WebAPI в теге <audio>, чтобы браузер сам сходил за файлом. А так, получается, что вы пустую работу делаете пиная файл между сервисами как мячик для пин-понга. mp3 - файл не маленький.
Да, я понимаю, но тут вопрос структуры проекта, веб-сервис будет непосредственно рядом жить с файлами, на той же виртуалке и на том же сервере, которые нужно прослушать, а asp сайт нет

Добавлено через 41 секунду
Поэтому с asp контроллера файлик не поднять...
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 09:42
Цитата Сообщение от Alex_trader Посмотреть сообщение
ерез Get запрос с браузера напрямую в WebApi - работает ,но нужно чтобы работало через обращение к asp контроллеру, ошибку выдаёт 416
Ничего не понял. Зачем "нужно"? Я вам предлагаю представить ваше хранилище mp3-файлов как простое веб-приложение (со стороны браузера) и из основного приложения кидать ссылки (в теге) на это хранилище. "Пробрасывать" файлы никакого смысла не имеет.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 09:54  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я вам предлагаю представить ваше хранилище mp3-файлов как простое веб-приложение (со стороны браузера)
Видимо я не так Вас понял. Разве сейчас не так? Я с помощью веб сервиса поднимаю файлики и отправляю в основной проект

Добавлено через 2 минуты
Кажется понял, напрямую из клиента обращаться к методу в веб апишке, тут опять таки вопрос иерархии проекта, к тому сервису может достучаться только промежуточный сервис, для остальных он закрыт по ТЗ.
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 09:55
Цитата Сообщение от Alex_trader Посмотреть сообщение
Я с помощью веб сервиса поднимаю файлики и отправляю в основной проект
А я вам предлагаю из основного приложения просто давать ссылки на сервис. Т.е., по факту, у вас будет два приложения: основное и хранилище файлов.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 09:56  [ТС]
Usaga, можете что то сказать о причине 416 ошибки, вижу её в браузере, гуглил, что то с headerом запроса...
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 09:58
Цитата Сообщение от Alex_trader Посмотреть сообщение
Кажется понял, напрямую из клиента обращаться к методу в веб апишке, тут опять таки вопрос иерархии проекта, к тому сервису может достучаться только промежуточный сервис, для остальных он закрыт по ТЗ.
Ага, значит вариант такой отсекается.

Получается, что придётся "прокидывать" файл. Тогда применяйте WebClient на сервере, получайте от него Stream и передавайте клиенту. Тащить весь файл целиком в промежуточный буфер - неэффективно и не нужно.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 09:58  [ТС]

Вот ответ от сервера
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 09:59
Цитата Сообщение от Alex_trader Посмотреть сообщение
можете что то сказать о причине 416 ошибки, вижу её в браузере, гуглил, что то с headerом запроса...
Описание говорит само за себя.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 09:59  [ТС]
Почему то длина ответа = 0...
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 10:00
Цитата Сообщение от Alex_trader Посмотреть сообщение
Почему то длина ответа = 0...
Ну так вы на свой код посмотрите. Я вам сразу, в самом начале замечание сделал по этому поводу: у вас на любую ошибку при чтении файла код выдаёт буфер нулевой длины.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 10:01  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Описание говорит само за себя.
Ссылка не работает

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
  public async Task<IActionResult> GetCallRecord(Guid commutationId)
        {
            if (commutationId == Guid.Empty) return this.BadRequest();
 
            var response = this.WebApiInvoke("CallRegistry/GetCallRecord", "GET", new Dictionary<string, object>{{"commutationId", commutationId}});
            var stream = await response.Content.ReadAsStreamAsync();
            return this.File(stream, "audio/mpeg");
        }
Добавлено через 18 секунд
Это в основном проекте
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 10:03
Цитата Сообщение от Alex_trader Посмотреть сообщение
Ссылка не работает
"416 Range Not Satisfiable". Сервер понял запрос, но отдать вам нечего - данных не больше нуля байт.

Добавлено через 58 секунд
Alex_trader, вот ваш же код апишки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public byte[] GetCallRecord(Guid commutationId)
        {
            try
            {
                var folder = "//share/RecordedFiles/";
                var fileName = "111.mp3";
 
                var filePath = folder + fileName;
                var fileExists = System.IO.File.Exists(filePath);
 
                if (fileExists)
                {
                    return File.ReadAllBytes(filePath);
                }
                else
                {
                    return new byte[0];
                }
            }
            catch (Exception e)
            {
                return new byte[0];
            }
        }
byte[0]; на мысли не наводит?
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 10:04  [ТС]
Это в сервисе:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public HttpResponseMessage GetCallRecord(Guid commutationId) 
        {
            string filePath = _callQueries.GetRecordFileName(commutationId);
 
            if (!string.IsNullOrWhiteSpace(filePath) && File.Exists(filePath))
            {
                var result = new HttpResponseMessage(HttpStatusCode.OK);
                var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                result.Content = new StreamContent(stream);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("audio/mpeg");
 
                return result;
            }
            else
            {
                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }
        }
Добавлено через 51 секунду
Цитата Сообщение от Usaga Посмотреть сообщение
вот ваш же код апишки:
Я переделал
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 10:05
Цитата Сообщение от Alex_trader Посмотреть сообщение
Это в сервисе:
Уже лучше, но результат тот же: если файла нет, то отдаём ничего вместо того, что бы честно сказать об ошибке.

Добавлено через 45 секунд
Запрос дошёл до апишки, но сервис нужный файл найти не смог и ответил HttpStatusCode.NoContent.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 11:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Запрос дошёл до апишки, но сервис нужный файл найти не смог и ответи
Как можно поправить метод? Всю голову поломал уже...

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
честно сказать об ошибке.
Что нужно вернуть чтобы было более понятнее, если файлик не найден?
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 11:34
Цитата Сообщение от Alex_trader Посмотреть сообщение
Как можно поправить метод? Всю голову поломал уже...
Никак. У вас или файла не оказалось, или идентификатор пришёл битый. Поставьте точку останова и оцените обстановку.

Цитата Сообщение от Alex_trader Посмотреть сообщение
Что нужно вернуть чтобы было более понятнее, если файлик не найден?
Статус 500 с текстом ошибки.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 15:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Статус 500 с текстом ошибки.
C#
1
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
Как сюда записать текст ошибки?
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
29.09.2017, 16:05
Alex_trader, у класса HttpResponseMethod есть свойство Content, пишите туда в виде текста или в виде JSON - тут как вам удобнее.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
29.09.2017, 20:15  [ТС]
Usaga, Вопрос, интересная ситуация, при выполнении этого метода глобальный ExceptionHandler WebApi ловит exception: Произошла ошибка при копировании содержимого в поток, а блок try/catch нет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 public HttpResponseMessage GetCallRecord(Guid commutationId) //TODO: отладить
        {
            try
            {
                string filePath = _callQueries.GetRecordFileName(commutationId);
 
                if (!string.IsNullOrWhiteSpace(filePath) && File.Exists(filePath))
                {
                    var result = new HttpResponseMessage(HttpStatusCode.OK);
                    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                    result.Content = new StreamContent(stream);
                    result.Content.Headers.ContentType = new MediaTypeHeaderValue("audio/mpeg");
 
                    return result;
                }
                else
                {
                    return new HttpResponseMessage(HttpStatusCode.InternalServerError);
                }
            }
            catch (Exception e)
            {
                return new HttpResponseMessage(HttpStatusCode.InternalServerError);
            }
        }
Добавлено через 1 минуту
Как такое может быть? Я бы понял если бы метод был асинхронным

Добавлено через 1 минуту
Вот что в аудит записалось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<audit>
  <e>
    <te>System.Net.Http.HttpRequestException</te>
    <msg>Произошла ошибка при копировании содержимого в поток.</msg>
    <stack>   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Owin.HttpMessageHandlerAdapter.&lt;SendResponseContentAsync&gt;d__20.MoveNext()</stack>
    <ie>
      <e>
        <te>System.IO.IOException</te>
        <msg></msg>
        <stack>   в Microsoft.Owin.Host.HttpListener.RequestProcessing.ExceptionFilterStream.BeginWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
   в System.Net.Http.StreamToStreamCopy.TryStartWriteSync(Int32 bytesRead)
   в System.Net.Http.StreamToStreamCopy.BufferReadCallback(IAsyncResult ar)</stack>
        <ie>
          <e>
            <te>System.Net.HttpListenerException</te>
            <msg>Попытка выполнить операцию для несуществующего сетевого подключения</msg>
            <stack>   в System.Net.HttpResponseStream.BeginWrite(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   в Microsoft.Owin.Host.HttpListener.RequestProcessing.ExceptionFilterStream.BeginWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)</stack>
          </e>
        </ie>
      </e>
    </ie>
  </e>
</audit>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2017, 20:15
Помогаю со студенческими работами здесь

Winmm.dll. Воспроизведение mp3 файлов по прямой ссылке из интернета
Всем хай. Задача: воспроизводить mp3 файлы по прямой ссылке из интернета. Проблема: почему-то не все ссылки воспроизводятся. Пример...

Пропали эскизы папок с mp3 файлами, отсутствуют теги в mp3 файлах
Доброго времени суток, появилась такая проблема: пропали эскизы папок с mp3 файлами, а так же исчезли теги в mp3 файлах, примерно с недели...

Как определить длительность Mp3 файла. MP3 плеер на библиотеке BASS 2.4
В процессе поиска ответов я наткнулся на эту тему https://www.cyberforum.ru/delphi-beginners/thread83454.html Судя по всему, создателю...

Как поставить в Mp3 плеере на кнопку окрытие не одного mp3 файла ??
Привет ! У меня такая проблема я пишу mp3 плеер на Delphi и у меня в нём есть кнопка открытия файлов и при окрытии mp3 файлов можно открыть...

[Решено]STM32F4 + Helix mp3 не кодирует некоторые mp3
Вдохновлённый топиком в сообществе от товарища MykiSmith. На stm32f4Dyscovery прикрутил Hetyx mp3 decoder. Проект взял тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru