Начало видео Для воспроизведения с использованием c# ASP. NET MVC - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь позволить людям сохранять видео в базе данных, тогда другие пользователи могут смотреть это видео онлайн. Я сохраняю свои файлы в wwwroot/videos/Username, сохраняя другую информацию (название видео, описание, URL) в базе данных. Получил все файлы для сохранения, но не могу воспроизвести видео. Провел некоторое исследование и выяснил, что по соображениям безопасности firefox и chrome не могут воспроизводить видео с вашего диска. Лучше ли правильно сохранить видеофайл IFormFile в базе данных и вызывать его через день? Или есть способ заставить это работать?

Загрузка и сохранение видео:

[HttpPost]
public async Task<IActionResult> UploadVideo(VideoViewModel video, IFormFile file)
{
    if (file.Length > 0)
    {
        try
        {
            string userName = (User.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Name).Value);
            string pathString = Path.Combine(@"path", userName);
            if (!Directory.Exists(pathString))
            {
                Directory.CreateDirectory(pathString);
            }
            int fCount = Directory.GetFiles(pathString, "*", SearchOption.TopDirectoryOnly).Length + 1;
            var filePath = Path.Combine(pathString, file.FileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
                _videoLogic.SaveVideo(new Video(video.VideoId, video.Description, file.FileName, DateTime.Now, filePath, video.CategoryId));
            }
        }
        catch (Exception ex)
        {
            ViewBag.Message = "ERROR: " + ex.Message.ToString();
        }
    }
    else
    {
        ViewBag.Message = "You have not specified a file.";
    }
    return RedirectToAction("UploadVideo");
}

Попытка просмотра видео:

<h2>Overzicht Videos gebruiker</h2>

<!DOCTYPE html>
<html>
<head>
    <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        @foreach(var item in Model)
        {
            <div class="col-sm-4 col-md-4 col-xs-12">
                <div class="modal-title" style="width:250px;">@item.Name</div>
                <hr/>
                <div class="video-frame">
                    <video style="width:250px; height:150px;" controls>
                        <source src="@Url.Content(item.ContentUrl)" type="video/mp4" />
                    </video>
                </div>
            </div>
        }
    </div>
</body>
</html>

Код для получения видео в контроллере:

[HttpGet]
public ActionResult GetVideosUser(UserViewModel user)
  {
     List<VideoViewModel> videoViewModels = new List<VideoViewModel>();
     string userName = user.FirstName + " " + user.LastName;
     string pathString = Path.Combine(@"path", userName);
     List<Video> videos = _videoLogic.GetVideos();
     foreach (Video video in videos)
     {
       VideoViewModel videoViewModel =  new VideoViewModel(video);
       videoViewModels.Add(videoViewModel);
     }
return View("ViewerVideoList", videoViewModels);
  }

Этот код правильно загружает данные в мою базу данных и загружает правильный файл в мой видеофолдер. Он также правильно получает ContentUrl, указанный выше. Как я могу заставить это видео воспроизводиться правильно? Заранее большое спасибо!

Изображение кода:! [Код]: https://imgur.com/a/xdprrAw

URL в Chrome: / wwwroot/video/Jesse%20Oosterwijk/WhatsApp%20Video%202019-12-04%20at%2018.04.49.mp4

! [ChromeCode]: https://imgur.com/a/kCM3p71

! [FileIsThere]: https://imgur.com/a/WaXQtUd

CorrectExtensions https://imgur.com/a/KTI2vSv

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Узнал, как решить проблему. Через внедрение зависимостей я могу добавить IHostingEnvironment в мой видеоконтроллер. Таким образом, я могу легче сохранять видео на своем веб-сайте root.

Добавление среды размещения:

public class VideoController : Controller
{

    private readonly VideoLogic _videoLogic;
    private readonly CategoryLogic _categoryLogic;
    private readonly ReportLogic _reportLogic;
    private readonly CommentLogic _commentLogic;
    private readonly UserLogic _userLogic;
    private readonly IHostingEnvironment _environment;

    public VideoController(VideoLogic videoLogic, CategoryLogic categoryLogic, ReportLogic reportLogic, CommentLogic commentLogic, UserLogic userLogic, IHostingEnvironment environment)
    {
        _videoLogic = videoLogic;
        _categoryLogic = categoryLogic;
        _reportLogic = reportLogic;
        _commentLogic = commentLogic;
        _userLogic = userLogic;
        _environment = environment;
    }

В коде, сохраняющем видео:

[HttpPost]
public async Task<IActionResult> UploadVideo(VideoViewModel video, IFormFile file)
{
    if (file.Length > 0)
    {
        try
        {
            int userId = int.Parse(User.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Sid)?.Value);
            string userName = (User.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Name).Value);
            string folder = Path.Combine(_environment.WebRootPath, "video");
            string url = @"\video\" + userName + @"\" + file.FileName;
            string pathString = Path.Combine(folder, userName);
            if (!Directory.Exists(pathString))
            {
                Directory.CreateDirectory(pathString);
            }
            var filePath = Path.Combine(pathString, file.FileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
                _videoLogic.SaveVideo(new Video(userId, video.VideoId, video.Description, file.FileName, DateTime.Now, url, video.CategoryId));
            }
        }
        catch (Exception ex)
        {
            ViewBag.Message = "ERROR: " + ex.Message.ToString();
        }
    }
    else
    {
        ViewBag.Message = "You have not specified a file.";
    }
    return RedirectToAction("UploadVideo");
}

После этого вы можете просто получить видео из базы данных и получить URL-адрес оттуда! Спасибо за помощь

0 голосов
/ 07 января 2020

Провел некоторые исследования и обнаружил, что по соображениям безопасности firefox и chrome не могут воспроизводить видео с вашего диска.

Вы можете попытаться получить доступ к этим видеофайлы по пути относительно web root, а не по физическому пути.

Name = "user1",
ContentUrl = "~/videos/user1/movie.mp4"

Результат теста

enter image description here

Примечание: при возникновении проблемы, если вы выберете Консоль или html источник в вашем браузере, вы можете найти путь к файлу выглядит следующим образом.

enter image description here

...