2010-02-01 7 views
5

이미지를 표시 할 ASP.NET MVC 응용 프로그램이 있습니다.ASP.NET MVC 동적으로 생성 된 이미지 URL

이러한 이미지는 파일 시스템 또는 데이터베이스 내에있을 수 있습니다. 내 이미지에서 Url.Action을 사용할 수 있고 내 컨트롤러에서 작업을 호출하고 관련 위치에서 이미지를 반환 할 수 있기 때문에이 방법이 유용합니다.

그러나 Amazon S3에 저장된 이미지를 지원할 수 있기를 원합니다. 이 경우 컨트롤러 액션이 이미지를 반환하는 것을 원하지 않으며 대신 Amazon S3의 이미지 URL을 생성해야합니다.

내 로직 내에서이 로직을 수행 할 수는 있지만

<% 경우 (Model.Images [0] == .ImageLocation ImageLocation.AmazonS3) {%> // 아마존

이미지 나 이미지가 제 있는지 확인해야

렌더링. 내가 (는 데이터베이스, 파일 시스템 또는 아마존 S3에있을 여부) 이미지가 크기에 있는지 확인할 수 있도록

는 기본적으로 내 컨트롤러에 크기 값을 전달해야합니다. 이미지가 존재한다고 확신하면 URL을 반환합니다. 의미가

희망,

답변

2

다음 방법을 시도해보십시오.

이미지 태그의 모델 클래스입니다. 유형의 Model.Images

public class ImageModel 
{ 
    public String Source { get; set; } 
    public String Title { get; set; } 
} 

도우미

public static String Image(this HtmlHelper helper, String source, String title) 
{ 
    var builder = new TagBuilder("img"); 
    builder.MergeAttribute("src", source); 
    builder.MergeAttribute("title", title); 
    return builder.ToString(); 
} 

보기 IEnumerable<ImageModel>

...  
<%= Html.Image(Model.Images[0].Source, Model.Images[0].Title) %> 

액션 액션은 의사 코드의 일종이다

public ActionResult ActionName(/*whatever*/) 
{ 
    // ... 
    var model = ...; 
    //... 

    var model0 = ImageModel(); 
    if (Image0.ImageLocation == ImageLocation.AmazonS3) 
     model0.Source = "an amazon url"; 
    else 
     model0.Source = Url.Action("GetImageFromDatabaseOrFileSystem", "MyController", new { Id = Image0.Id }); 
    model0.Title = "some title"; 
    model.Images.Add(model0); 
    // ... 
    return View(model); 
} 

그러나 아이디어는 분명해야합니다. 나는 여전히 최고의 솔루션을 확신 아니에요하지만 나는, 실행 가능한 해결책을 온 여러 반복 후

+0

감사합니다. Anton입니다.이 방법이 좋습니다. 현재 모델이 IList 이고 IList가 인 IList이므로 새로운 ViewModel을 만들 것이라고 생각합니다. 필요한 이미지 크기와 같은 항목을 정의하고 제품 당 하나의 이미지 만 가질 수있는 새로운보기 모델로이 문제를 해결하는 것이 좋습니다. 한 번 완료되면 코드를 게시합니다. –

-1

당신은 이미지를로드하는 HttpWebRequest 만들 수 있습니다. 응답의 헤더를 확인합니다. 응답이 200이면 성공을 의미하고, 그렇지 않으면 무언가가 잘못되었습니다.

+0

안녕하세요, 주요 요구 사항은 내가 URL을 구성 할 수 있어요 때문이다

덕분에 동적으로 이미지가 위치해야 "한다"어디를 기반으로. 이미지가 있는지 확인하기 위해 HttpWebRequest를 사용할 필요가 없습니다. System.IO.File.Exists를 사용하거나 Amazon S3 버킷을 확인할 수 있습니다. 감사합니다. Ben –

1

.

원래 Anton의 제안을 따르고 내 컨트롤러 작업 내에서 이미지 URL을 설정했습니다. 이것은 다음 코드로 충분히 간단했다 :

 products.ForEach(p => 
     { 
      p.Images[0].Url = _mediaService.GetImageUrl(p.Images[0], 200); 
     }); 

그러나, 나는 곧이 방법은 내게 필요한 유연성을 제공하지 않은 것으로 나타났다. 종종 다른 크기의 이미지를 표시해야하며 Product.FullSizeImageUrl, Product.ThumbnailImageUrl과 같은 모델의 속성을 사용하고 싶지 않습니다.

"제품"에 관한 한 원래 업로드 된 이미지에 대해서만 알고 있습니다.우리가 조작하고 표시하는 방법이나 Amazon S3에 캐싱하는지 여부는 알 필요가 없습니다.

웹 양식에서는 사용자 컨트롤을 사용하여 제품 세부 정보를 표시 한 다음 리피터 컨트롤을 사용하여 이미지를 표시하고 이미지 URL을 프로그래밍 방식으로 코드 뒤에 설정합니다.

컨트롤러 액션 :

[ChildActionOnly] 
    public ActionResult CatalogImage(CatalogImage image, int targetSize) 
    { 
     image.Url = _mediaService.GetImageUrl(image, targetSize); 
     return PartialView(image); 
    } 

미디어 서비스 :

  public MediaCacheLocation CacheLocation { get; set; } 

    public string GetImageUrl(CatalogImage image, int targetSize) 
    { 
     string imageUrl; 

     // check image exists 
     // if not exist, load original image from store (fs or db) 
     // resize and cache to relevant cache location 

     switch (this.CacheLocation) { 
      case MediaCacheLocation.FileSystem: 
       imageUrl = GetFileSystemImageUrl(image, targetSize); 
       break; 
      case MediaCacheLocation.AmazonS3: 
       imageUrl = GetAmazonS3ImageUrl(image, targetSize); 
       break; 
      default: 
       imageUrl = GetDefaultImageUrl(); 
       break; 
     } 

     return imageUrl; 
    } 

HTML 헬퍼 :

나는 ASP.NET MVC에서 RenderAction의 사용이 나에게 유사한 유연성을 준 것을 발견
 public static void RenderCatalogImage(this HtmlHelper helper, CatalogImage src, int size) { 
     helper.RenderAction("CatalogImage", "Catalog", new { image = src, targetSize = size }); 
    } 

사용법 :

이 지금 내게 필요한 유연성을 제공하고 두 디스크에 크기가 조정 된 이미지를 캐싱 또는 아마존 S3에 저장 지원
<%Html.RenderCatalogImage(Model.Images[0], 200); %> 

.

생성 된 이미지 URL이 SSL/가상 폴더를 지원하는지 확인하려면 url 유틸리티 메서드를 사용해야합니다. 현재 VirtualPathUtility를 사용하고 있습니다. 벤

관련 문제