2009-08-08 3 views
6

다음은 내가하고 싶은 것입니다. 내가보기에 쓰는 내용이 있습니다. 이 콘텐츠에는 문서 관련 이미지 참조가 있습니다. 그래서 예를 들어, 나는 다음과 같은 URL에서 찾고 있어요 경우 : 이것은 분명히 이미지를 쿼리 브라우저를 야기ASP.NET MVC의 동일한 라우팅 된 URL 경로에서 이미지 검색

<img src="myimage.png" /> 

:

http://localhost/article/8AB98/ 

내용은 다음과 같은 형식의 이미지가있을 수 있습니다

http://localhost/article/8AB98/myimage.png 

그러나 mvc 라우팅 때문에이 이미지를 찾을 수 없습니다. 그 URL이 올바른 이미지를 브라우저로 반환하도록하는 간단한 방법을 알고 있습니까?

참고 :를가 마크 업이 원본 그대로 유지한다는 사실은 중요합니다 ...이 어떻게 든 그들이 현재보기의 URL 외부의 다른 폴더를 가리 키도록 이미지 URL을 쓰기를 다시하는 질문에서 불행히도 것을 의미 .

감사합니다. 그것을 할 수

답변

5

나는 당신이 말할 때 당신이

<img src="myimage.png" /> 

가 브라우저에 렌더링되어야 무엇을 의미 "는 마크 업이 원본 그대로 유지한다는 사실은 중요하다"고 믿고있어 그래서 당신은 트릭을해야합니다

http://localhost/article/8AB98/myimage.png 

의 요청 URL을 복용하고 당신이 그것을 저장 한 곳, 올바른 이미지를 찾아 브라우저로 돌아가려면 해당 정보를 사용으로 웹 서버.

두 가지 옵션이 생각 나기는하지만 이미지 저장 위치를 ​​밝히지 않았기 때문에 어느 것을 추천하는지 알기가 어렵습니다.

옵션 1 - URL Rewriter는

는 ISAPI_Rewrite의 사본을 구입하고 그들이 그것을 사는 곳마다 이미지를 얻을 갈 수 있도록 다시 위의 기준을 충족하는 모든 URL을 가지고있다. ISAPI_Rewrite에 대한 자세한 내용은 here입니다.

옵션 2 - 사용자 지정 HttpHandler를

당신은 요청 URL을 구문 분석하고 그 다음 이미지를 찾기 위해 수행 응답 스트림에 반환해야 무엇을합니까 모든 PNG 파일 요청에 매핑 된 HttpHandler를 쓸 수

. 단점은 성능에 심각한 문제가 될 수있는 aspnet_isapi.dll을 통과하도록 모든 PNG 요청을 매핑하도록 IIS에 지시해야한다는 것입니다.

귀하의 문제를 올바르게 이해하고 있는지 확실하지 않지만 도움이 되었기를 바랍니다. 행운을 빕니다.

+0

정확히 두 옵션을 사용하지 않았지만 이것이 궁극적으로 해결 된 해결책이었다. 질문에 대한 다른 대답을 세부 정보로 게시 할 것입니다. –

1

한 가지 방법은 이미지 파일에 대한 IgnoreRoute에 넣어하는 것입니다 : 당신은 Url.Content() 메소드를 사용할 수 있습니다

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("article/{ArticleID}/{name}.png"); 
    ... 
6

.

<img src="<%= Url.Content("~/images/myimage.png") %>" /> 

그러면 응용 프로그램 루트에서 URL이 해결됩니다.

+1

Html.Image ("~/images/myimage")를 가질 수 있도록 도우미도 작성하고 싶습니다. png ","myAltText "); 그리고 당신의 도우미 방법은 Phil의 코드가 가지고있는 것을 기본적으로 반환 할 것입니다. –

+0

안녕 Phil ... "myimage.png"에서 url.content로 반환 할 URL을 변경하는 것은 콘텐츠의 마크 업이 변경되지 않기 때문에 불가능합니다. 그 사실을 제외하고, 나는 실제로이 마크 업 ()을 브라우저에 렌더링해야한다. (언급 된 @thinkzig) –

-1

@ thinkzig의 솔루션을 약간 다른 방식으로 사용해도 끝났습니다. MVC Futures 어셈블리의 FileContent를 사용하여 방금 이미지를 처리 ​​할 다른 경로를 추가했습니다.

public ActionResult Image(string id, string image) 
{ 
    string articlePath = Server.MapPath("~/views/article/"); 
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image)); 
    return this.File(filePath, "image"); 
} 

내가 싸워야했다 다른 하나의 작은 일이 있었다 :
routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" }); 
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" }); 

이 새로운 액션 메소드

는 단순히은 articleID 및 이미지 이름을 기준으로 파일 경로를 구성한다. 사용자가 슬래시 ( http://localhost/article/8AB98)없이 액세스하면 브라우저는 articleID가 파일이라고 생각하고 이미지 틀린 폴더 ( http://localhost/article/img.png)를 찾으려고 시도합니다.

감사하게도, mvc는 요청을 이미지 작업 이름 "id"매개 변수로 라우팅하므로 단순히 "."을 찾을 수 있습니다. id를 입력 한 다음 일반 이미지 작업을 사용하여 처리하십시오. ID와 파일 이름

private ActionResult RedirectToImage(string id) 
{ 
    if (Request.UrlReferrer == null) 
    { 
     return Content("invalid request"); 
    } 

    var referrer = Request.UrlReferrer.ToString(); 
    if (referrer.Contains("?")) 
    { 
     referrer = referrer.Split('?')[0]; 
    } 

    var realId = Path.GetFileName(referrer); 
    return this.Image(realId, id); 
} 

당신은 내가의 URL 참조 자에 의존하고 있습니다 것을 파악

if (id.Contains(".")) 
{ 
    return RedirectToImage(id); 
} 

그리고 다음 redirecttoimage 코드 : 문서 작업에

실제 기사 ID를 얻으십시오. 사용자가 이미지를 마우스 오른쪽 버튼으로 클릭하여 (슬래시없이 볼 때) "새 탭에서 이미지 열기"를 선택하면 기사 ID가 무엇인지 알 수 없으므로 "유효하지 않은 요청" 문자열을 사용자에게 보냅니다. 그 상황에서 그 사용자를 지원하려고하지는 않았으므로 괜찮습니다 .-)