2010-01-11 1 views
3

이미지를 업로드하는 웹 응용 프로그램이 있고 이미지는 서버의 임시 폴더에 저장되고 웹 페이지에서 aspx 페이지에 표시됩니다.웹 핸들러가 포스트 백에서 실행되지 않음

영문의 코드 :

<img src="PreviewImageQualityHandler.ashx" alt="Picture not loaded" runat="server" id="imagePreview" /> 

사진을 업로드하고 세션에 고유 한 ID를 추가하는 코드 :

protected void uploadButton_Click(object sender, EventArgs e) 
{ 
    if (FileUploadControl.FileName.EndsWith(".jpg") || FileUploadControl.FileName.EndsWith(".jpeg")) 
    { 
     string tempFileName = Path.GetTempFileName(); 
     FileUploadControl.SaveAs(tempFileName); 
     Session["tempName"] = tempFileName; 
     Response.Write(Session["tempName"]); 
     fileName = FileUploadControl.FileName; 
    } 
    else 
    { 
     Response.Write("<script>alert('Please select a .jpg/.jpeg image to upload')</script>"); 
    } 
} 

webhandler 코드 :

public class PreviewImageQualityHandler : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     try 
     { 
      if (context.Session.Count > 0) 
      { 
       string sessID = context.Session["tempName"].ToString(); 
       Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID); 
       context.Response.ContentType = "image/jpg"; 
       MemoryStream ms = new MemoryStream(); 
       bmp.Save(ms, ImageFormat.Bmp); 
       byte[] b = ms.ToArray(); 
       context.Response.OutputStream.Write(b, 0, b.Length); 
      } 
     } 
     catch(Exception ex) 
     { 

     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

내 문제는 웹 핸들러가 첫 번째 이미지 업로드에서만 실행된다는 것입니다. 새로운 이미지를 업로드하려고하면 웹 핸들러가 실행되지 않습니다.

웹 핸들러에서 Session과 관련된 모든 것을 제거하면 모든 단일 포스트 백에서 실행됩니다.

누군가 내 문제에 관해 밝힐 수 있다면, 나는 매우 감사 할 것입니다!

+0

불행히도 Francis, 나는보고있는 오류를 복제 할 수 없습니다. 아마도 게시자가 게시하는 코드 외부에 문제가 발생했을 가능성이 있습니까? 내기가 어딘가에 캐싱 될 것입니다. 확실하지 않은 무엇 또는 어디서. –

답변

4

OK

감사

프랜시스, 내 대답의 재 작성 (이전 답변을 본적이 없다면 역사 참조). 코드에 대한 몇 가지 참고 사항 :

  1. Response.Write을 사용하지 마십시오. 언제 글을 쓸 것인지를 결정할 수 없으며 종종 브라우저에서 볼 수 없습니다. 대신 asp:Literal 컨트롤을 사용하거나 asp:Label을 사용하십시오. 현재의 문제와 관련이 있습니다. 브라우저에 표시되지 않으면 아무 일도 없을 것이라고 생각할 수 있습니다.

  2. 파일 스트림의 열기/닫기를 안전하게 지키지 않습니다. using 블록을 주변에 추가하여 스트림이 제대로 닫히고 폐기되도록하십시오. 현재 가지고있는 방식대로 파일은 스레드가 살아 있고 오래 걸리는 한 열려 있습니다.

    using(Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID)) 
    { 
        //.. your code... 
        using(MemoryStream.... etc) 
        { 
         .... 
        } 
    } 
    

    하지 폐쇄의 문제 : 당신은 당신이 읽기를 열 수있을 수도 있습니다 그리고 당신은 매우 신속하게 밖으로 실행하겠습니다, 같은 위치에 다음 번에 새 파일을 쓸 수 없습니다 코드가 실제로 사용될 때 사용할 수있는 파일 핸들러.

  3. 세션에서 기대하는 것이 확실하지 않습니다. 그러나 사진과 함께 일부 ID를 사용하고 현재 사용자 정보로 데이터베이스에 저장 한 다음 이미지 URL에 요청 쿼리 문자열로 추가하는 것이 좋습니다. 그런 식으로, 당신은 세션 문제를 문제로 얻을 수 :

    <img src="myimage.ashx?id=1234" /> 
    

    하나, 1234 디스크에 뭔가 의미, 또는 훨씬 더 안전 차례로 디스크에 무언가를 의미 데이터베이스에 뭔가, (을 말한다).

  4. 브라우저가 요청을 다시 보내는 지 확실하지 않으면 FireBug와 함께 FireFox를 사용하십시오. 그러면 FireBox에서 HTTP 요청 및 응답에 대한 자세한 정보를 제공합니다. 동일한 이름을 사용하면 브라우저가 (디버그 모드에 있지 않은 경우) 매번 새로운 요청을 보내지 않습니다.

  5. 캐치 올 예외 처리기를 사용 중입니다.그곳에 무언가를 쓰거나 그 위치에 중단 점을 놓습니다. catch-all 예외 처리기는 매우 위험합니다. 많은 예외가 절대 발견되지 않습니다. 아마도 현재 코드가 예외를 throw합니다 (위의 2 번 포인트 참조). 예외 처리기를 제거하고 예외가 Visual Studio 디버거에서 발견되면 무엇이 일어나는지 알 수 있습니다.

저는 꽤 많은 문제점을 알고 있습니다. 하나씩 찾아 가서 도움이되는지 확인하십시오. 최소한 코드가 안정화 될 것입니다.

+0

고마워요! 실제로 이미지의 캐싱이 문제였습니다. 이것은 "장난"일 수 있지만 "imagePreview.Src ="PreviewImageQualityHandler.ashx "+"? x = "+ DateTime.Now;" 나를 불행에서 구해라. Response.Write (""); 디버깅 목적으로 만 사용되며 제거됩니다. 감사합니다. Francis – Francis

+0

이제 다행입니다. 디버깅 목적이라 할지라도,'Response.Write'는 HTML이나 브라우저가 렌더링하는 방식에 혼란을 가져올 수 있습니다. 그러면 부작용이 많이 발생하여 문제를 일으킬 수 있습니다. 대신 디버그 출력에'Debug.Write'를 사용하고 Visual Studio의 디버그 창을 모니터링하십시오. 또한 프로덕션으로 갈 때,'Debug.Write'는 코드를 방해하지 않습니다. – Abel

+0

다시 한번 감사드립니다! 확실히 "using"을 사용하기 위해 코드를 다시 작성합니다. 나는 이미 DB에 고유 한 ID를 넣을 생각을 했었지만 사용자가 로그인하는 방식 때문에 mypage.aspx? ID = 1234에서 사용자 ID를 사용할 수 없으므로 동료가 그렇게하지 말라고 조언했습니다. 그 안에 아무것도없는 catch는 디버깅을위한 것이고 거기에 breakpoint가 있습니다. :) Debug.Write()를 전혀 알지 못했습니다. 나는 지금부터 대신 그것을 사용할 것이다. 시간 내 주셔서 감사합니다. 안부 프란시스 – Francis