c# — Задан физический путь, на сервере ожидается виртуальный путь.Маппат

#c# #asp.net

Вопрос:

Я пытаюсь изменить свой каталог, который находится на моем локальном диске c, но в названии указаны ошибки. Есть ли какой-нибудь способ, кроме использования сервера.Маппат?. Я использую пакет nuget ZipOutputStream.

Я хочу найти свой каталог в C: вместо этого внутри папки проекта.

 public FileResult DownloadZipFileSig(string FileId){     var fileName = "FilesDL".zip";  var tempOutPutPath = Server.MapPath(Url.Content("C:/Users/SDILAP2/Desktop/ID_Esig_Files"))   fileName;      using (ZipOutputStream s = new ZipOutputStream(System.IO.File.Create(tempOutPutPath)))  {  s.SetLevel(9);     byte[] buffer = new byte[4096];    Listlt;stringgt; stringList = FileId.Split(',').ToList();    Listlt;stringgt; tempList = new Listlt;stringgt;();    foreach (string str in stringList)  {    if (System.IO.File.Exists(Server.MapPath("C:/Users/SDILAP2/Desktop/ID_Esig_Files/"   str   ".jpeg")))  {  tempList.Add(Server.MapPath("C:/Users/SDILAP2/Desktop/ID_Esig_Files/"   str   ".jpeg"));    }      }    stringList = tempList;      for (int i = 0; i lt; stringList.Count; i  )  {  ZipEntry entry = new ZipEntry(Path.GetFileName(stringList[i]));  entry.DateTime = DateTime.Now;  entry.IsUnicodeText = true;  s.PutNextEntry(entry);    using (FileStream fs = System.IO.File.OpenRead(stringList[i]))  {  int sourceBytes;  do  {  sourceBytes = fs.Read(buffer, 0, buffer.Length);  s.Write(buffer, 0, sourceBytes);  } while (sourceBytes gt; 0);  }  }  s.Finish();  s.Flush();  s.Close();    }    return File(finalResult, "application/zip", fileName);    }  

Ответ №1:

Возможно, вы не совсем понимаете, как работает веб-URL и как следует использовать server.mappath ().

Веб-пользователи:

Когда у вас есть веб-URL, вся html-разметка на странице или даже URL, предоставленные пользователем, называются веб-ссылками.

Итак, если у вас есть папка из корня вашего веб-сайта, скажем, под названием MyUpLoads

Тогда это просто папка в именах путей к веб-сайту.

напр.:

 www.mywebsite/UpLoadFiles/cat.jpg  

И если вы пишете html-разметку, то вы можете и можете указать URL-адрес для приведенного выше изображения или, скажем, с помощью элемента управления изображением html, вы можете установить ImageUrl или «источник» (src) для этого файла.

И если вы используете IIS (а не IIS express), то, конечно, вы можете добавить то, что называется вирусной папкой. Скажем, какой-нибудь большой серверный диск на ДРУГОМ компьютере в той же сети.

Таким образом, эта виртуальная папка может находиться в любом месте вашей сети, и, конечно, снова для веб-HTML или веб-URL вы снова используете этот формат:

 www.mysite/MassiveFolder/info.pdf  

или, может быть,

 localhost:5403/MyUpLoads/cat.jpg  

Однако, в коде позади?

ЛЮБОЙ код, стоящий за (c# или vb.net) ВСЕГДА использует пути к файлам WINDOWS plane jane. Это действительные полные имена файлов Windows.

Это означает, что код, лежащий в основе, на 100% свободен для открытия/чтения/использования/просмотра/воспроизведения с ЛЮБЫМ файлом на компьютере и любым файлом даже в компьютерной сети.

Поэтому, когда вы используете

 server.mapPath("localhost:5403/MyUpLoads/cat.jpg")  

Затем все вышесказанное переводится в локальную плоскость пути к файлу DOS/WINDOWS!!!!

Вышесказанное вполне может стать

 C:UsersAlbertKallalsourcereposCSharpWebAppMyUpLoadscat.jpg  

Так что имейте в виду:

 web urls - HTML/asp markup in a page = web based syntax/path.  computer path: plane jane full path names like all windows software.  

Итак, в вашем случае?

 var fileName = "FilesDL".zip";  var tempOutPutPath = @"C:/Users/SDILAP2/Desktop/ID_Esig_Files"))   fileName;  

Таким образом, вам не нужен и не нужен пользовательский сервер.mappath, поскольку он предназначен ТОЛЬКО для данного HTML-или веб-URL-адреса, который вы хотите перевести в систему путей к файлам локального компьютера.

Поскольку ваши имена путей уже находятся в этом формате, в этом нет необходимости.

на самом деле, имейте в виду, что вы можете использовать этот факт в своих интересах.

ЛЮБАЯ папка (или виртуальная папка) будет отображаться в ваших допустимых URL-адресах и именах путей (на основе Интернета).

Однако у вас могут быть некоторые PDF-файлы или конфиденциальные документы. Поэтому переместите эту папку из корневой папки или папки веб-проекта.

Теперь допустимых URL-адресов не существует и даже не разрешено.

Однако, код позади? Он может запускать, просматривать и использовать ЛЮБОЙ файл на вашем компьютере — и вы используете код для получения этих файлов, — но веб-сайт, веб-сторона вещей не имеет возможности использовать, просматривать или получать эти файлы. И вы все еще можете делать такие вещи, как, скажем, предоставить кнопку загрузки, но ваш код может извлечь файл, прочитать его и передать конечному пользователю (потоковая передача файла).

Таким образом, вам нужно (нужно) только использовать сервер.Функция MapPath, КОГДА URL-адрес приходит с веб-сайта или html-разметки. Это переведет этот веб-URL-адрес в обычное старое доброе полное имя пути к файлу Windows.

Однако, если у вас уже есть полное имя пути Windows, то перевод URL-адреса в путь к файлу Windows не требуется.

Таким образом, по большей части ваш код может просматривать, просматривать, захватывать и воспроизводить файлы на сервере. Веб-пользователи или веб-URL-адреса ДОЛЖНЫ быть частью папок на веб-сайте, но для кода, стоящего за ними, таких ограничений не существует.

Теперь, когда код развертывается на веб-сервере, часто действуют некоторые права безопасности файлов, но, как правило, этот веб-код НЕ ограничен и не ограничивается ТОЛЬКО папками на веб-сайте. Эти ценные URL-адреса являются ограничением для пользователей и веб-браузеров, и, как уже отмечалось, часто папка за пределами веб-сайта используется в целях безопасности, поскольку никакие возможные допустимые веб-пути не могут использовать/просматривать или даже разрешать файлы за пределами корневой начальной папки веб-сайта.

Поэтому для этих существующих файлов вам не нужен server.mappath.