2016-12-08 3 views
0

В моей системе разработки (Win 10 Pro, VS 2015), я тестирую приложение веб-форм в VS 2015; он использует главную страницу. Элемент управления изображением на странице содержимого asp ничего не показывает, когда я пытаюсь отобразить фотографию из файла, написанного только после изменения размера, тогда как он отображает исходную фотографию просто отлично. Ниже приведен фрагмент кода с проблемой, описанной в комментариях:Изображение.ImageUrl = ... ничего не отображается

// During testing, sRelLoc contains "~/i/SlideShow/1th.jpg" (original photo) 
    string sRelLocMod = sRelLoc.Replace("~/", "").Replace("/", "\\"); 
    // During testing, Global.sgHomeDir contains "K:\\DataAndDocs\\12_Projects\\TinyNP\\TinyNP\\" 
    string sImgUrl = Global.sgHomeDir + sRelLocMod; 
    // sImgUrl now contains 
    System.Drawing.Image Photo = null; 
    // Read original photo from file 
    using (FileStream fs = new FileStream(sImgUrl, FileMode.Open, FileAccess.Read)) 
    { 
     Photo= System.Drawing.Image.FromStream(fs); 
    } 
    // ResizeImage from https://www.codeproject.com/articles/191424/resizing-an-image-on-the-fly-using-net 
    System.Drawing.Image PhotoResized = ResizeImage(Photo, new Size(400, 400), true); 
    sImgUrl = Global.sgHomeDir + "i\\tempImg.jpg"; 
    using (FileStream fs = new FileStream(sImgUrl, FileMode.Open, FileAccess.Write)) 
    { 
     PhotoResized.Save(fs,System.Drawing.Imaging.ImageFormat.Jpeg); 
    } 
    // NOTE THAT: The image has been saved correctly in its resized form inside the expected directory 
    sImgUrl = sImgUrl.Replace("\\", "/"); 
    //sImgUrl now contains "K:/DataAndDocs/12_Projects/TinyNP/TinyNP/i/tempImg.jpg" 
    // Image1 is an Image control on an asp.net web page. 
    // PROBLEM: The following statement displays nothing where Image1 is 
    //   placed (not even a red-x or anything) , ... 
    Image1.ImageUrl = sImgUrl; 
    // ... but displays the unresized original just fine when the following statement is used instead: 
    //   Image1.ImageUrl = sRelLoc; 

То же поведение, независимо от того, работает он в режиме отладки или нет.

Возможно, есть лучший подход, чем запись измененной фотографии во временный файл tempImg.jpg, а затем чтение из него?

Update после Jignesh-х и ответы Сами:

Я использую MapPath в Default.aspx.cs (см новые комментарии ниже).

Теперь, используя System.Uri для преобразования пути в Url, который начинается с "file: ///". Ничего не отображается. Замена «файла:» на «http:» приводит к отображению сломанного изображения. Обновленный код:

// During testing, sRelLoc contains "~/i/SlideShow/1.jpg" (original photo) 
    string sRelLocMod = sRelLoc.Replace("~/", "").Replace("/", "\\"); 
    // During testing, Global.sgHomeDir contains "K:\\DataAndDocs\\12_Projects\\TinyNP\\TinyNP" 
    // which was obtained in Default.aspx.cs Page Load Event by 
    // Global.sgHomeDir = HttpContext.Current.Server.MapPath(null); 
    string sImgPath = Global.sgHomeDir + "\\" + sRelLocMod; 
    // sImgPath now contains "K:\\DataAndDocs\\12_Projects\\TinyNP\\TinyNP\\i\\SlideShow\\1.jpg" 
    System.Drawing.Image Photo = null; 
    // Read original photo from file 
    using (FileStream fs = new FileStream(sImgPath, FileMode.Open, FileAccess.Read)) 
    { Photo= System.Drawing.Image.FromStream(fs); } 
    // ResizeImage from https://www.codeproject.com/articles/191424/resizing-an-image-on-the-fly-using-net 
    System.Drawing.Image PhotoResized = ResizeImage(Photo, new Size(400, 400), true); 
    sImgPath = Global.sgHomeDir + "\\i\\tempImg.jpg"; 
    // sImgPath now contains "K:\\DataAndDocs\\12_Projects\\TinyNP\\TinyNP\\i\\tempImg.jpg" 
    using (FileStream fs = new FileStream(sImgPath, FileMode.OpenOrCreate, FileAccess.Write)) 
    { PhotoResized.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); } 
    // I have verified that the image has been saved correctly in its resized form inside the expected directory 
    System.Uri ImgUrl = new System.Uri(sImgPath, UriKind.Absolute); 
    // Image1 is an Image control on an asp.net web page. 
    string sImgUrl = ImgUrl.ToString(); 
    //sImgUrl now contains "file:///K:/DataAndDocs/12_Projects/TinyNP/TinyNP/i/tempImg.jpg" 
    Image1.ImageUrl = sImgUrl; 
    // The above statement DOES NOT work (displays nothing at all) 
    // However: 
    //Image1.ImageUrl = "~/i/tempImg.jpg"; // ** DOES ** work ok 
    // If I replace "file:" with "http:", a broken image symbol is displayed. 

Но что работа использует тильду «~», даже если это не выглядит как URL. Можно ли использовать тильду? Будет ли это зависеть от меня, например, при развертывании на сервере хостинга?

+0

Поскольку браузер не имеет доступа к диску. Вы должны указать ему URL, а не путь. Также не делайте ручных изменений с URL-адресов на пути, вот что такое «MapPath()». –

ответ

0

Используйте свойство ImageUrl, чтобы указать URL-адрес изображения для отображения в элементе управления Image. Вы можете использовать относительный или абсолютный URL-адрес. Относительный URL-адрес связывает местоположение изображения с местоположением веб-страницы без указания полного пути на сервере. Путь относится к местоположению веб-страницы. Это облегчает перемещение всего сайта в другой каталог на сервере без обновления кода. Абсолютный URL-адрес предоставляет полный путь, поэтому перемещение сайта в другой каталог требует обновления кода.

По абсолютным URL-адресам они означают весь путь IIS к URL-адресу (не путь к каталогу на диске). (то есть http://yourVirtualDirectory/ExternalImages/logo.jpg).

Так вот в коде выше sImgUrl = «K: /DataAndDocs/12_Projects/TinyNP/TinyNP/i/tempImg.jpg» она должна быть как http://yourVirtualDirectory/tempImg.jpg

Смежные вопросы