#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.