Blazor Server中InputFile仅返回文件名无路径的文件上传问题
Blazor Server文件上传:解决FileNotFoundException问题
浏览器出于安全限制,不会将客户端文件的完整本地路径传递给服务器,所以你通过e.File.Name只能拿到文件名和扩展名,无法直接用这个名称去服务器本地目录查找文件——因为文件此时还在用户的客户端设备上,不在服务器的项目文件夹里,这就是抛出FileNotFoundException的根本原因。
你需要通过InputFile提供的文件流来读取或保存文件,而不是依赖本地路径。以下是修正后的代码示例:
// 改为异步Task方法,适配文件IO的异步操作特性 private async Task ImportFile(InputFileChangeEventArgs e) { var uploadedFile = e.File; // 示例1:读取文件内容到内存(可用于解析、存入数据库等场景) using var fileStream = uploadedFile.OpenReadStream(); using var memoryStream = new MemoryStream(); await fileStream.CopyToAsync(memoryStream); byte[] fileContent = memoryStream.ToArray(); // 此处可根据业务需求处理fileContent,比如转字符串、解析Excel等 // 示例2:将文件保存到服务器本地目录 // 指定服务器上的存储目录(建议创建专门的Uploads文件夹,避免污染项目根目录) string saveDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Uploads"); // 确保目标目录存在,避免创建文件时抛出目录不存在的错误 Directory.CreateDirectory(saveDirectory); string savePath = Path.Combine(saveDirectory, uploadedFile.Name); // 写入文件到服务器 await using var outputStream = new FileStream(savePath, FileMode.Create); // 重新打开流(因为前面的fileStream已读取到末尾) await uploadedFile.OpenReadStream().CopyToAsync(outputStream); }
补充注意事项:
- 必须使用异步方法(
async Task),文件IO操作属于异步操作,同步调用可能导致线程阻塞 - 保存文件到服务器时,要确保应用程序对目标目录有写入权限
- 不要尝试解析或使用客户端文件路径,这是浏览器安全机制不允许的,也没有实际意义
内容的提问来源于stack exchange,提问作者Walter Levy
相关产品推荐
相关产品推荐

