简体   繁体   English

使用 c# ASP.NET MVC 获取视频播放

[英]Getting Video To play using c# ASP.NET MVC

I am trying to let people save video's on a database, then other users can watch these video's online.我试图让人们将视频保存在数据库中,然后其他用户可以在线观看这些视频。 I save my files in wwwroot/videos/Username, while saving other info (name of video, description, url) in a database.我将文件保存在 wwwroot/videos/Username 中,同时将其他信息(视频名称、描述、url)保存在数据库中。 Got all of the files to save, but can't seem to be able to play the video's.得到了所有要保存的文件,但似乎无法播放视频。 Did some research and saw that because of security reasons, firefox and chrome, are not able to play video's from your disk.做了一些研究,发现由于安全原因,firefox 和 chrome 无法从您的磁盘播放视频。 Is it better to save the IFormFile videofile to the database correctly and call it a day?将 IFormFile 视频文件正确保存到数据库并收工是否更好? Or is there a way to make this work?或者有没有办法使这项工作?

Uploading and saving the video:上传和保存视频:

[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");
}

Trying to view the video:尝试观看视频:

<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>

Code for getting video in Controller:在控制器中获取视频的代码:

[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);
  }

This code correctly uploads data to my database, and uploads the correct file to my videofolder.此代码将数据正确上传到我的数据库,并将正确的文件上传到我的视频文件夹。 It also correctly gets the ContentUrl stated above.它还正确地获取了上述 ContentUrl。 How can I get this video to play correctly?我怎样才能让这个视频正确播放? Many thanks in advance!提前谢谢了!

Image of the code: ![Code]: https://imgur.com/a/xdprrAw代码图片:![代码]: https : //imgur.com/a/xdprrAw

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

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

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

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

Did some research and saw that because of security reasons, firefox and chrome, are not able to play video's from your disk.做了一些研究,发现由于安全原因,firefox 和 chrome 无法从您的磁盘播放视频。

You can try to access these video files via a path relative to the web root , rather than a physical path.您可以尝试通过相对于Web 根目录的路径而不是物理路径来访问这些视频文件。

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

Test Result测试结果

在此处输入图片说明

Note: when the issue occurs, if you check Console or html source in your browser, you may find the file path looks like this.注意:出现问题时,如果您在浏览器中查看 Console 或 html 源代码,您可能会发现文件路径如下所示。

在此处输入图片说明

Found out how to solve the problem.找到了解决问题的方法。 Through dependency injection I can add an IHostingEnvironment to my videocontroller.通过依赖注入,我可以向我的视频控制器添加一个 IHostingEnvironment。 This way i can save the video more easily to my webroot.这样我可以更轻松地将视频保存到我的 webroot。

Adding the hostingenvironment:添加托管环境:

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;
    }

In the code saving the video:在保存视频的代码中:

[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");
}

After that you can just get the video from the database and get the url from there!之后,您可以从数据库中获取视频并从那里获取 url! Thanks for all the help感谢所有的帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM