#c# #asp.net #relative-path
#c# #asp.net #относительный путь
Вопрос:
Я сохраняю путь к файлу в базе данных как ~/FolderName / FileName и при попытке открыть файл с помощью System.IO.FileInfo(путь к файлу) таким образом. Он не может расшифровать путь к файлу. Более того, я использую это утверждение в файле загрузки класса, поэтому я не могу использовать Page.Сервер.MapPath. Есть ли способ обойти эту проблему.
Это следующие строки кода, которые я использую:
if (dr1.Read())
{
String filePath = dr1[0].ToString();
HttpContext.Current.Response.ContentType = "APPLICATION/OCTET-STREAM";
String disHeader = "Attachment; Filename="" fileName """;
HttpContext.Current.Response.AppendHeader("Content-Disposition", disHeader);
System.IO.FileInfo fileToDownload = new System.IO.FileInfo(filePath);
string fullName = fileToDownload.FullName;
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.WriteFile(fileToDownload.FullName);
sqlCon.Close();
}
где путь к файлу имеет формат ~/ComponentFolderForDownloading/FileName.exe
Как я могу решить эту проблему?
Комментарии:
1. По какой-либо причине вы не можете использовать MapPath в своем классе DownloadFile?
2. @Joe может кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??
Ответ №1:
Если вы не можете использовать Server.MapPath
для определения местоположения файла, вам нужно использовать что-то другое. FileInfo
Класс не может принять ASP.NET виртуальный путь в его конструкторе. Для этого нужен реальный, физический путь к файлу.
Вам нужно удалить ~/
из начала пути; возможно, заменить /
на
, а затем использовать Path.Combine
с корневым каталогом вашего приложения, чтобы найти физическое местоположение. Но это предполагает, что ваши местоположения находятся в физических каталогах, а не в виртуальных.
Server.MapPath
был, конечно, создан специально для этого.
Альтернативой могло бы быть хранение реальных, физических местоположений файлов в БД; либо в дополнение к виртуальному, либо вместо него., ASP.NET единицы.
Комментарии:
1. может ли кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??
Ответ №2:
Если вы знаете, что работаете в IIS, вы можете использовать:
HttpContext.Current.Server.MapPath("~/someurl");
Комментарии:
1. может ли кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??
2. Обратные косые черты — это соглашение файловой системы Windows. Я всегда использую косые черты для интернет-URL.