如何在Razor Pages内网应用中实现服务器PDF文件的本地指定目录下载?
实现方案
由于浏览器的安全限制,无法直接指定用户本地的保存目录,最优方案是将两个PDF打包为ZIP文件,让用户下载后自行解压到目标目录,具体实现如下:
1. 后端(C#):实现ZIP生成与下载接口
在对应Razor页面的后台代码(如YourPage.cshtml.cs)中添加以下逻辑:
首先注入IWebHostEnvironment以获取wwwroot路径:
private readonly IWebHostEnvironment _webHostEnvironment; public YourPageModel(IWebHostEnvironment webHostEnvironment) { _webHostEnvironment = webHostEnvironment; }
然后添加下载处理方法:
public IActionResult OnGetDownloadDocuments() { // 定位到服务器上的PDF存储目录 var pdfDirectory = Path.Combine(_webHostEnvironment.WebRootPath, "filledpdffiles"); // 要打包的目标文件名(注意和服务器上的文件名完全匹配,包括空格、大小写) var targetFiles = new[] { "confidentiality Statement.pdf", "Package 2022.pdf" }; using var memoryStream = new MemoryStream(); // 创建ZIP压缩包 using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { foreach (var fileName in targetFiles) { var filePath = Path.Combine(pdfDirectory, fileName); if (System.IO.File.Exists(filePath)) { var zipEntry = zipArchive.CreateEntry(fileName); using var entryStream = zipEntry.Open(); using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); fileStream.CopyTo(entryStream); } } } memoryStream.Position = 0; // 返回ZIP文件供用户下载 return File(memoryStream, "application/zip", "Confidential_Documents.zip"); }
2. 前端(Razor页面):添加下载按钮
在对应的.cshtml页面中添加触发下载的按钮,可选择两种方式:
方式一:直接跳转触发下载
<button onclick="window.location.href='?handler=DownloadDocuments'" class="btn btn-primary"> 下载文件包 </button>
方式二:异步请求(更友好的交互)
<button id="downloadBtn" class="btn btn-primary">下载文件包</button> <script> document.getElementById('downloadBtn').addEventListener('click', async () => { try { const response = await fetch('?handler=DownloadDocuments'); if (!response.ok) throw new Error('下载失败'); const blob = await response.blob(); const downloadUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = downloadUrl; link.download = 'Confidential_Documents.zip'; document.body.appendChild(link); link.click(); window.URL.revokeObjectURL(downloadUrl); document.body.removeChild(link); } catch (err) { alert(err.message); } }); </script>
3. 关键注意事项
- 确保服务器上
wwwroot/filledpdffiles目录存在,且两个PDF文件的文件名(包括空格、大小写)与代码中完全一致,避免找不到文件。 - 配置服务器权限,确保应用程序池账号拥有读取
filledpdffiles目录的权限。 - 内网环境下无需额外处理跨域,但需保证用户能访问到服务器的静态文件目录。
内容的提问来源于stack exchange,提问作者rimi
相关产品推荐
相关产品推荐

