【问题标题】:Why wont video start downloading in mvc?为什么视频不能在 mvc 中开始下载?
【发布时间】:2020-09-10 21:22:50
【问题描述】:

MVC 对每个视频都有一个下载链接:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.NameOfVideo)
        </td>
        <td>
            @Html.ActionLink("Download", "DownloadFile", new {fileName = item.NameOfVideo})
        </td>
    </tr>
}

索引函数如下所示:

public ViewResult Index()
{
    string[] filePaths = Directory.GetFiles(("./wwwroot/Videos/"));
    
    List<Video> files = filePaths.Select(filePath => new Video {NameOfVideo = Path.GetFileName(filePath)}).ToList();

    return View(files);
}

我所有的视频都存储在 wwwroot 文件夹中名为 Videos 的文件夹中。

这是下载功能:

public ActionResult DownloadFile(string filename)
{
    // Get path with included filename
    var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Videos", filename);
    
    byte[]? file = null;
    FileInfo fileinfo = new FileInfo(path);
    file = System.IO.File.ReadAllBytes(path);
    
    // GetContentType returns corresponding Mimetype
    return File(file, GetContentType(path), filename);
}

当我在本地运行它时,一切正常,我可以下载任何大小和类型的视频。 当我在我的 VPS(CentOs 8)上上传发布版本并在那里运行它时,我注意到我仍然可以下载非常小的文件,例如 5000 字节。 当我尝试下载比“失败 - 文件不完整”更大的文件时:

是否存在限制下载最大文件大小的限制? 也是此类应用程序的“DownloadFile”功能最佳方式的代码。我正在尝试制作非常简单的视频数据库供我个人使用,只是为了练习,最大视频大小将保持在 1gb 左右。

更新 1: 我做了一些额外的故障排除,发现了一些有趣的事情。 我首先用

创建了几个文件
fsutil file createnew <nameIsFileSizeInBytes> <length>

例如:

fsutil file createnew 500000 500000 

这将创建名为 500000 的文件,大小为 500000 字节。 然后我上传了这些文件以在 VPS 上发布构建,结果是:
200000 字节的文件 - 可下载
250000 字节的文件 - 不可下载
300000 字节的文件 - 可下载
350000 字节的文件 - 不可下载
....
所以这里的模式很明显。这达到了 500000 字节的文件大小,之后所有下载都失败了。所以 500000 字节似乎是可以下载的最大值。为了进一步澄清,我添加了下载文件的视频:video of download process(可能需要放大才能看到:D)
谁能指出我应该在哪里寻找这个奇怪问题的根源(我可以从 VPS 下载大文件并通过 ftp 上传)?

更新 2: 通过网络选项卡(chrome)进行了一些故障排除,附上结果图片:

Picture 1

Picture 2

Picture 3

我也使用 nginx,也许配置中有一些东西让我无法下载文件?
Config file of nginx

【问题讨论】:

标签: c# asp.net-mvc nginx video vps


【解决方案1】:

请求正文大小有默认 limit of 30MB,但我不知道 ASP.NET Core MVC 中响应正文大小有任何限制。也许你应该检查网络服务器配置。

至于代码,PhysicalFile method 采用文件的绝对路径。无需将文件的全部内容加载到内存中。

    [HttpGet]
    public IActionResult Download(string videoName)
    {
        var videoFilePath = Path.GetFullPath(Path.Join("wwwroot\\Videos", videoName));

        if (!System.IO.File.Exists(videoFilePath))
            return NotFound();

        return PhysicalFile(videoFilePath, "application/octet-stream", videoName);
    }

【讨论】:

  • 您的代码运行良好,而且效率更高,但我仍然遇到下载问题,我更新了我的帖子,提供了更多信息以进一步描述问题。
  • 您是否尝试过使用其他工具下载文件? Powershell 有 Invoke-WebRequest 命令。视频中的进度圈看起来很奇怪。好像下载停止并且浏览器尝试恢复它(我只是在猜测)。您也可以查看浏览器发送的请求,按F12,重新加载页面,切换到网络选项卡开始下载。
  • 好吧,我尝试使用网络选项卡,每次无论是哪个文件,它都会给出 200 个结果。我很难尝试从中分析信息。我在最初的帖子中添加了一些图片,也许你可以从中做出一些东西?
猜你喜欢
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多