2013-04-30 2 views
3

나는 Sql Server 데이터베이스에 저장된 이미지를 가지고 있으며 웹 페이지에 이미지를 표시하려고합니다.ImageUrl을 보내는 대신 페이지로 이미지를 스트리밍 할 수 있습니까?

문제는 ASP.NET의 Image 컨트롤에 ImageUrl 속성이있어 이미지 파일이 들어있는 폴더의 경로 값을 사용한다는 것입니다. 그러나 나는 데이터베이스 테이블에서 이미지를 그리기 때문에 이미지를 디스크에 저장하지 않으므로 경로를 제공 할 수 있습니다. 이미지를 페이지로 직접 스트리밍하겠습니다.

이 작업을 수행하는 데 어려움을 겪고 있습니다.이 작업을 수행하는 유일한 방법은 이미지를 위치에 임시 저장 한 다음 이미지 컨트롤에 붙여 넣는 것입니다. . 하지만 뭔가를 놓친 것일까 요? 추가 할

편집 :

이 여행 경비에 대한 영수증은 상환 제시하는 데 필요한 회계 시스템을위한 것입니다. 우리는 30,000 명의 사용자가 영수증을 스캔하여 상환 요청과 관련하여 저장할 수있게 할 생각입니다. 이것을 파일 시스템에 저장하는 것은 Sql Server 테이블에 저장된 파일 시스템에 대한 인덱스를 사용하는 한 가지 방법입니다. 그러나 SQL Server에서이 작업을 수행 할 수 있는지 확인하도록 요청 받았고이를 잘 수행 할 수 있지만 디스플레이/보고서 측면이 중요합니다. 이러한 상환 요청에 대한 보고서를 생성해야하며 Crystal Reports가 파일 시스템에 얼마나 잘 어울리는 지 알지 못합니다. 즉, SQL Server에서이 작업을 훨씬 쉽게 수행 할 수 있습니다.

+0

SQL Server에 저장하지 않고 대신 파일 시스템에 저장 하시겠습니까? 그것은 장기적으로 당신에게 더 나은 성능을 줄 수 있습니다. –

+0

가능한 복제본 [C#의 SQL Server에서 스트리밍 VARBINARY 데이터] (http://stackoverflow.com/questions/5042589/streaming-varbinary-data-from-sql-server-in-c-sharp) –

+0

또는 인라인 이미지를 원한다면 - http://stackoverflow.com/questions/6826390/how-to-convert-image-to-data-uri-for-html-with-c –

답변

-1
<img runat="server" 
      src='<%# "getImage.aspx?ID=" + DataBinder.Eval(Container.DataItem, 
      "ImageIdentity") %>' ID="Img1"/> 

는 getimage.aspx에

sqlConnection.Open();  
    SqlCommand sqlCommand = new SqlCommand("Select Images" ,sqlConnection); 
    Reader= sqlCommand.ExecuteReader(CommandBehavior.CloseConnection); 
    byte [] byteArray 
    if(Reader.Read()) 
    { 
    byteArray= (byte[]) Reader["Images"]; 
    } 

    System.IO.MemoryStream mstream = new System.IO.MemoryStream(byteArray,0,byteArray.Length); 
    System.Drawing.Image dbImage = System.Drawing.Image.FromStream(new System.IO.MemoryStream(byteArray)); 
    System.Drawing.Image thumbnailImage = dbImage.GetThumbnailImage(100,100,null,new System.IntPtr()); 
    thumbnailImage.Save(mstream,dbImage.RawFormat); 
    Byte[] thumbnailByteArray = new Byte[mstream.Length]; 
    mstream.Position = 0; 
    mstream.Read(thumbnailByteArray, 0, Convert.ToInt32(mstream.Length)); 
    Response.Clear(); 
    Response.ContentType="image/jpeg"; 
    Response.BinaryWrite(thumbnailByteArray); 
+1

여기에서 템플릿 엔진이 필요 없으므로 .ashx 대신 .ashx를 사용하고 .ashx가 약간 빨라질 수 있습니다. :) – mihi

+1

-1 : 코드가 약간 다른 것으로 보이고 설명의 흔적이 누락 된 것 같습니다. –

+0

나는 코드가 OP가 요구하는 것을 수행한다고 생각한다.이 방법으로 이미지가 제대로 캐쉬되지는 않지만 –

2

당신은 데이터 URI를 사용하여 생각 해 봤나? 데이터 URI를 사용하면 이미지와 같은 데이터를 페이지에 직접 삽입 할 수 있습니다. 이미지는 기본 64로 인코딩 된 다음 HTML에 <img> 요소의 소스로 포함됩니다. 일반적으로 데이터 URI에 대한 자세한 내용은 here을 참조하십시오.

C#에서이 작업을 수행하는 방법에 대한 자세한 내용은 this question and answer입니다. 이미지 요소는 마치 <img src="data:image/png;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrS"/>과 같은 것으로 끝납니다.

이미지에 데이터 URI를 사용할 때의 주요 문제는 이전 버전의 IE가 지원되지 않거나 이미지 크기를 제한한다는 것입니다. Here은 데이터 URI의 브라우저 제한 사항에 대한 문서입니다.

관련 문제