在 ASP.NET 或 ASP.NET Core 專案中,將上傳的圖片儲存到伺服器特定資料夾時,最穩妥的做法是在伺服器端拼出完整的絕對實體路徑,避免相對路徑因部署位置、IIS 應用程式集區身分識別不同而失效。
// 取得網站根目錄實體路徑
string webRoot = Server.MapPath("~"); // ASP.NET WebForms / MVC
// 或 ASP.NET Core
// string webRoot = _hostingEnvironment.WebRootPath;
// 目標資料夾(可寫入)
string targetFolder = Path.Combine(webRoot, "Uploads", "Images");
// 確保資料夾存在
if (!Directory.Exists(targetFolder))
Directory.CreateDirectory(targetFolder);
// 組出最終檔案完整路徑
string fileName = Path.GetFileName(uploadedFile.FileName);
string absolutePath = Path.Combine(targetFolder, fileName);
// 儲存
uploadedFile.SaveAs(absolutePath); // HttpPostedFileBase
// 或 Core: using (var fs = new FileStream(absolutePath, FileMode.Create)) { await uploadedFile.CopyToAsync(fs); }
D:\WebSites\MyApp\),不受虛擬目錄層級影響。IIS AppPool\MyAppPool)需對 Uploads 資料夾有「寫入」權限。Guid.NewGuid().ToString("N") + Path.GetExtension(fileName) 產生唯一檔名,避免覆蓋。原問題中的 看起來像 CMS 模板標籤,若在 C# 後端硬拼這種字串會導致路徑解析錯誤。正確做法是後端存檔回傳相對 Web 路徑(如 
/Uploads/Images/abc.png)給前端,前端 `` 即可正常顯示。
掌握「伺服器端絕對路徑存檔、前端相對路徑顯示」這對基準模式,上傳功能就不會再踩路徑坑。