2011-09-26 1 views
0

iv'e 내가 이렇게HttpHandler를 응답, 부하 이미지에 이진 데이터를 쓰기

BL_Engine engine = (BL_Engine)Application["engine"]; 
    List<AppProduct> products = engine.Get_Products(); 
    Repeater1.DataSource = products; 
    Repeater1.DataBind(); 

iv'e 또한 내가이 제품 엔티티를 표현하는 데 사용하는 사용자 정의 컨트롤을 가지고 개체의 목록에 결합 된 리피터있어 사용자 컨트롤에 데이터 바인딩()를 오버라이드 (override) : 내 HttpHanlder 객체의

public override void DataBind() 
    { 
     AppProduct product = (Page.GetDataItem() as AppProduct); 
     lbl_title.Text = product.Title; 
     lbl_short.Text = product.Short; 
     lbl_date.Text = product.Date.ToShortDateString();      
     Session["current_img"] = product.Image1;    
     base.DataBind(); 
    } 

내가 응답 한 번만 그래서 마지막 사진에 기록되어 일어나는 반응 에 이미지 쓰기 .ASHX 파일에 저장 (ALL) 사용자가 제어합니다.

 public void ProcessRequest(HttpContext context) 
    { 
     byte [] image = (byte[])context.Session["current_img"];     
     context.Response.ContentType = "image/bmp"; 
     context.Response.OutputStream.Write(image, 0, image.Length); 
    } 

내가 각 개별 제어를위한 사전 에 란의

덕분에 바이너리 데이터를 쓸 수있는 방법을 어떤 생각.

답변

1

다른 접근 방식을 제안하겠습니다.

그래서 같이 "RUNAT = 서버"속성을 컨트롤에 일반 HTML 이미지 요소를 선언하고 설정 :

<img src="" runat="server" id="img_product" /> 

를 그런 다음 DataBind() 방법을 변경하는 대신이 작업을 수행 :

public override void DataBind() 
{ 
     AppProduct product = (Page.GetDataItem() as AppProduct); 
     lbl_title.Text = product.Title; 
     lbl_short.Text = product.Short; 
     lbl_date.Text = product.Date.ToShortDateString();      
     img_product.src= "\"data:image/jpg;base64,"+System.Convert.ToBase64String(product.Image1)+"\""; 
     base.DataBind(); 
} 

그리고 HTTPHandler를 제거하십시오. 당신은 이것을 위해 필요하지 않습니다.

+0

인코딩 된 바이트를 저장할 때 실제적으로 뭔가를 시도했습니다 올바른 확장명을 가진 파일에 추가하고 src 속성으로 추가했습니다. 감사합니다. 아프고 다른 것을 시도하십시오. –

+0

이 작동하지 않는 것 같습니다. .. 어디에서 해당 변환 문자열을 가져 왔습니까? 구문을 인식하지 못합니다. –

+0

@eranotzer 아주 잘 작동합니다 : http://msdn.microsoft.com/en-us/library/dhx0d524.aspx'Convert.ToBase64String'은'byte []'를 취하여 Base64 인코딩 된 문자열. MSDN 설명서 링크를 확인하십시오. 나는 그것을 사용했기 때문에 그것을 언급했다. – Icarus

1

현재 제품의 ID를 쿼리 문자열 매개 변수로 사용하도록 처리기를 변경하십시오. 핸들러에서 매개 변수를 기반으로 올바른 이미지 데이터를로드하고 대신 해당 데이터를 씁니다.

+0

내가 그 생각을하지만 난 내 데이터를 이동해야 각 이미지 에 대한 기본 정보 성능을 실제로 느리게하는 밖으로 모든 정보와 이미지를 얻었을 때 ... –

+0

그 해결책은 객체 또는 게으른 것으로부터 제외하여 제품과 함께 이미지 데이터를 반환하지 않는 것입니다 그것을로드합니다. 이 접근법은 매번 다운로드되지 않도록 이미지에 304를 반환 할 수있는 이점이있었습니다. – kmcc049

+0

나는 304가 뭔지 정말로 모른다. 어쩌면 당신은 그들을 사용하는 방법을 볼 수있는 좋은 소스를 참조 할 수 있습니까? –

0

이 경우에 대해 가장 좋은 방법은 @ icarus의 대답이라고 생각합니다. 내 응용 프로그램에 대해 더 복잡한 아키텍처처럼 보였으므로 무시하지 않은 무시 무시한 kmcc049의 대답이 아닙니다.

HTTPHANDLER를 삭제하십시오.

나는 이미지 파일의 형식과 데이터를 저장했습니다.

 public enum ImageType : byte {jpg,jpeg,png,gif} 

     private byte[] Get_Image(HttpPostedFile file) 
     { 
      ImageType type = GetType(file.ContentType); 
      if (file.InputStream.Length <= 1) 
       return null; 
      byte[] imageData = new byte[file.InputStream.Length + 1 + 1]; 
      file.InputStream.Read(imageData, 1, imageData.Length+1); 
      imageData[0] =(byte)type; 
      return imageData; 
     } 

     private ImageType GetType(string _type) 
     { 
      ImageType t = default(ImageType); 
      string s = _type.Substring(_type.IndexOf('/')+1).ToLower() ; 
      switch (s) 
      { 
       case "jpg": t = ImageType.jpg; 
         break; 
       case "jpeg": t = ImageType.jpeg; 
         break; 
       case "png": t = ImageType.png; 
         break; 
       case "gif": t = ImageType.gif; 
         break; 
      } 
      return t; 
     } 

은 내가 추출 (내 사용자 컨트롤에) 내 데이터 바인딩 재정의에서 사용자 컨트롤에 추가 : 을

 public override void DataBind() 
     { 
      AppProduct product = (Page.GetDataItem() as AppProduct); 
      img_main.Attributes.Add("src",Build_Img_Data(product.Image1));       
      base.DataBind(); 
     } 


     private string Build_Img_Data(byte[] imageData) 
     { 
      ImageType type = (ImageType)imageData[0] ; 
      byte[] new_imageData = new byte[imageData.Length - 1]; 
      Array.ConstrainedCopy(imageData, 1, new_imageData, 0, new_imageData.Length); 
      MemoryStream ms = new MemoryStream(new_imageData); 
      string base64String = string.Format("data:image/{0};base64,{1}",type.ToString(),Convert.ToBase64String(ms.ToArray())); 
      return base64String; 
     }