下面我将为你提供几种主流的实现方法,从最简单、最推荐的方式到更传统的“手动”方式,并附上详细的代码示例和解释。

核心思路
无论使用哪种方法,其核心原理都是一致的:
- 用户选择文件:通过一个
<input type="file">元素让用户从本地选择视频文件。 - 读取文件内容:使用 JavaScript 的
FileReaderAPI 读取用户选择的文件。 - 生成临时 URL:为了安全,浏览器不允许直接通过本地路径(如
C:\videos\myvideo.mp4)访问文件,我们需要使用URL.createObjectURL()方法为选中的文件创建一个唯一的、临时的浏览器内部 URL。 - 播放视频:将这个临时 URL 赋值给 HTML5
<video>标签的src属性,浏览器就可以播放这个视频了。
使用 Blazor(推荐,现代 .NET Web UI 框架)
Blazor 是一个使用 .NET 构建交互式 Web UI 的框架,如果你正在使用 .NET 6/7/8,Blazor 是开发 Web 应用的首选,它允许你使用 C# 而不是 JavaScript 来处理客户端逻辑。
这是一个完整的 Blazor 组件示例 (VideoPlayer.razor):
@page "/video-player"
@inject IJSRuntime JSRuntime
<h3>本地视频播放器 (Blazor)</h3>
<input type="file" accept="video/*" @onchange="OnFileSelected" />
@if (videoSource != null)
{
<video width="600" height="400" controls>
<source src="@videoSource" type="@videoType" />
您的浏览器不支持 HTML5 视频。
</video>
}
@code {
private string? videoSource;
private string? videoType;
private async Task OnFileChange(InputFileChangeEventArgs e)
{
// 1. 获取用户选择的文件
var file = e.File;
// 2. 获取文件的 MIME 类型 ( video/mp4)
videoType = file.ContentType;
// 3. 使用 JSRuntime 来调用 JavaScript 的 URL.createObjectURL
// 这是最安全、最推荐的方式,因为它隔离了 JS 互操作
videoSource = await JSRuntime.InvokeAsync<string>("createObjectURL", file);
}
// 组件被销毁时,释放创建的 URL,防止内存泄漏
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!firstRender && videoSource != null)
{
await JSRuntime.InvokeVoidAsync("revokeObjectURL", videoSource);
}
}
}
对应的 JavaScript 代码

在你的 说明: 如果你使用的是传统的 Razor Pages 或 MVC 模式,你需要在视图中编写 HTML 和 JavaScript。 Razor 视图 ( 说明: 如果你维护一个旧的 ASP.NET Web Forms 应用,实现方式类似,但事件处理模型不同。 ASPX 页面 ( 说明: 重要注意事项: 选择哪种方法取决于你的项目类型,对于任何新的 .NET Web 应用,Blazor 是最先进、最推荐的选择。_Host.cshtml (Server Blazor) 或 index.html (Blazor WebAssembly) 文件的 <body> 标签结束前添加以下 <script>
<script>
// 为 Blazor 组件暴露的全局函数
window.createObjectURL = (file) => {
// 使用浏览器内置 API 创建临时 URL
return URL.createObjectURL(file);
};
window.revokeObjectURL = (url) => {
// 释放 URL,释放内存
URL.revokeObjectURL(url);
};
</script>
@onchange="OnFileSelected":当用户选择文件后,触发 OnFileChange 方法。InputFileChangeEventArgs:这是 Blazor 提供的参数,包含了选择的文件信息。JSRuntime:Blazor 的服务,用于调用 JavaScript 代码,我们用它来创建和释放 URL,这是 Blazor 与浏览器 API 交互的标准方式。accept="video/*":提示文件选择器只显示视频文件。
使用 Razor Pages / MVC (传统 ASP.NET Core Web 应用)
VideoPlayer.cshtml)@page
@model VideoPlayerModel
@{
ViewData["Title"] = "本地视频播放器";
}
<h3>本地视频播放器</h3>
<input type="file" id="videoFile" accept="video/*" />
<br />
<br />
<video id="videoPlayer" width="600" height="400" controls style="display: none;">
您的浏览器不支持 HTML5 视频。
</video>
@section Scripts {
<script>
document.getElementById('videoFile').addEventListener('change', function (e) {
const file = e.target.files[0];
const videoPlayer = document.getElementById('videoPlayer');
if (file) {
// 1. 获取文件的 MIME 类型
const fileType = file.type;
// 2. 创建临时 URL
const url = URL.createObjectURL(file);
// 3. 设置 video 标签的 src 和 type
videoPlayer.src = url;
videoPlayer.type = fileType;
// 4. 显示 video 标签
videoPlayer.style.display = 'block';
// 5. 当视频播放结束或组件卸载时,释放 URL
videoPlayer.onended = function () {
URL.revokeObjectURL(url);
};
}
});
</script>
}

@section Scripts:这是 Razor Pages/MVC 中定义页面特定 JavaScript 的标准位置。document.getElementById(...):使用原生 DOM API 获取 HTML 元素。addEventListener('change', ...):监听文件输入框的 change 事件。
使用 Web Forms (较老的技术,不推荐新项目使用)
VideoPlayer.aspx)<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="VideoPlayer.aspx.cs" Inherits="WebFormsApp.VideoPlayer" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">本地视频播放器</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>本地视频播放器</h3>
<asp:FileUpload ID="FileUpload1" runat="server" accept="video/*" />
<br />
<br />
<video id="videoPlayer" runat="server" width="600" height="400" controls style="display: none;">
您的浏览器不支持 HTML5 视频。
</video>
</div>
</form>
<script>
// 使用 jQuery 简化 DOM 操作 (如果项目已引用 jQuery)
$(document).ready(function () {
$('#<%= FileUpload1.ClientID %>').change(function (e) {
const file = e.target.files[0];
const videoPlayer = $('#<%= videoPlayer.ClientID %>');
if (file) {
const url = URL.createObjectURL(file);
videoPlayer.attr('src', url);
videoPlayer.attr('type', file.type);
videoPlayer.show();
videoPlayer.on('ended', function () {
URL.revokeObjectURL(url);
});
}
});
});
</script>
</body>
</html>
runat="server":Web Forms 中,服务器控件需要这个属性。<%= Control.ClientID %>:这是 Web Forms 中获取客户端 ID 的方式,因为服务器会自动生成唯一的 ID。
总结与最佳实践
特性
Blazor (方法一)
Razor Pages / MVC (方法二)
Web Forms (方法三)
技术栈
现代,C# 为主
传统,HTML/JS/C#
较老,HTML/JS/C#
代码组织
组件化,逻辑与视图分离
视图与控制器/页面模型分离
视图与后端代码紧密耦合
客户端逻辑
C# (通过 JSRuntime 互操作)
原生 JavaScript 或 jQuery
原生 JavaScript 或 jQuery
推荐度
⭐⭐⭐⭐⭐ (新项目首选)
⭐⭐⭐⭐ (传统项目)
⭐⭐ (仅维护旧项目)
<video> 和 FileReader API,所有现代浏览器(Chrome, Firefox, Edge, Safari)都支持。URL.createObjectURL() 创建的 URL 会占用内存,当不再需要时(例如视频播放完毕、用户选择新文件或离开页面),必须调用 URL.revokeObjectURL() 来释放它,否则会导致内存泄漏,Blazor 示例中通过 OnAfterRenderAsync 来处理这一点是很好的实践。
