ASP.NET Core中如何访问bin文件夹外的项目文件?
解决ASP.NET Core MVC访问TempFiles文件夹静态文件问题
核心问题
ASP.NET Core默认仅对外暴露wwwroot目录下的静态资源,项目根目录下的TempFiles文件夹不在默认访问范围内,导致前端无法直接访问其中的file.wav文件。此外,前端代码中使用的相对路径../容易因页面URL层级变化导致路径解析错误。
解决步骤
1. 配置静态文件访问权限
在Program.cs中添加代码,将TempFiles文件夹注册为可访问的静态资源目录,并指定前端访问的路由前缀(比如/tempfiles):
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); var app = builder.Build(); // 保留原有异常处理、路由等中间件配置 // 注册TempFiles为静态资源目录 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, "TempFiles")), RequestPath = "/tempfiles" // 前端通过此路径访问文件夹内文件 }); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
2. 修正前端路径处理逻辑
移除不可靠的相对路径../,直接使用配置好的根路径前缀构造音频文件URL,同时避免重复绑定SignalR的ReceiveFile事件(原代码每次输入都会绑定一次,可能导致重复触发):
const connection = new signalR.HubConnectionBuilder().withUrl("/SandboxHub").build(); connection.start().catch(err => console.error(err)); $("#sentence-input").on("input", async function () { const sentence = $(this).val(); await connection.invoke("TransformIntoTTS", sentence); }); // 将事件绑定移到input事件外,避免重复绑定 connection.on("ReceiveFile", function (fileUrl) { // 处理后端返回的fileUrl: // 情况1:如果后端返回的是文件名(如"file.wav") const audioSrc = "/tempfiles/" + fileUrl; // 情况2:如果后端返回的是物理路径(如"D:\MyWebAPP\TempFiles\file.wav"),提取文件名 // const fileName = fileUrl.split(/[\\/]/).pop(); // const audioSrc = "/tempfiles/" + fileName; $("#audio-player").attr("src", audioSrc); });
3. 检查SignalR后端返回的fileUrl格式
确保后端TransformIntoTTS方法返回的fileUrl是文件名或网站根相对路径,不要返回本地物理磁盘路径。例如后端可以返回"file.wav",而非Path.Combine(ContentRootPath, "TempFiles", "file.wav")。
内容的提问来源于stack exchange,提问作者CitrusBoy
相关产品推荐
相关产品推荐

