MemoryStream을 asp:image 컨트롤에 바인딩하는 방법은 무엇입니까?
-
09-06-2019 - |
문제
MemoryStream을 asp:image 컨트롤에 바인딩하는 방법이 있습니까?
해결책
핸들러는 다른 요청과 마찬가지로 URL 매개변수를 허용할 수 있습니다.따라서 링크를 연결하는 대신 <asp:image/>
에게 image.ashx
넌 그걸로 설정했을 거야 image.ashx?ImageID=[Your image ID here]
.
다른 팁
가장 좋은 방법은 이미지를 반환하는 HttpHandler를 만드는 것입니다.그런 다음 asp:Image의 ImageUrl 속성을 HttpHandler의 URL에 바인딩합니다.
여기에 몇 가지 코드가 있습니다.
먼저 HttpHandler를 만듭니다.
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
public class ImageHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.Clear();
if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
{
int id = Int32.Parse(context.Request.QueryString["id"]);
// Now you have the id, do what you want with it, to get the right image
// More than likely, just pass it to the method, that builds the image
Image image = GetImage(id);
// Of course set this to whatever your format is of the image
context.Response.ContentType = "image/jpeg";
// Save the image to the OutputStream
image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
else
{
context.Response.ContentType = "text/html";
context.Response.Write("<p>Need a valid id</p>");
}
}
public bool IsReusable
{
get
{
return false;
}
}
private Image GetImage(int id)
{
// Not sure how you are building your MemoryStream
// Once you have it, you just use the Image class to
// create the image from the stream.
MemoryStream stream = new MemoryStream();
return Image.FromStream(stream);
}
}
다음으로, asp:Image를 사용하고 있는 aspx 페이지 내에서 호출하세요.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
</div>
</form>
</body>
</html>
그리고 그게 다입니다.
ASP.NET에서 동적 이미지를 생성해야한다고 가정합니다. 운이 좋을 수도 있습니다.http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449
Hanselman은 최근에 이에 대해 블로그에 올렸습니다.http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx
@Will 및 Ben Griswald:"image.aspx" 대신 "image.ashx"를 사용하세요.
이는 전체 ASP.Net 페이지보다 더 가볍고 text/html 이외의 콘텐츠 유형을 처리하도록 특별히 설계되었습니다.
MemoryStream을 이미지에 데이터 바인딩하는 것은 불가능하지만 Label/GenericControl, 일부 코드 및 데이터 URI 체계 페이지에 이미지를 삽입하는 방법이 있지만 해당 접근 방식에는 심각한 문제가 있습니다.
단점
- 변경하기 전에 포함된 콘텐츠를 추출하고 디코딩한 다음 나중에 다시 인코딩하고 다시 포함해야 합니다.
- 쿠키는 지원되지 않습니다.
- 두 번 이상 포함된 정보는 포함된 파일의 일부로 다시 다운로드되므로 브라우저 캐시의 이점을 누릴 수 없습니다.
- 브라우저는 URI 길이를 제한하여 효과적인 최대 데이터 크기를 생성할 수 있습니다.예를 들어, 이전 버전의 Opera에서는 URI가 4kB로 제한되었고 IE8 Beta 1에서는 32kB로 제한되었습니다.
- 데이터는 단순한 스트림으로 포함되며 많은 처리 환경(예: 웹 브라우저)에서는 메타데이터, 데이터 압축 또는 콘텐츠 협상과 같은 더 큰 복잡성을 제공하기 위해 컨테이너(예: multipart/alternative 또는 message/rfc822) 사용을 지원하지 않을 수 있습니다.
- Microsoft의 Internet Explorer 버전 7(2008년 2분기 현재 시장의 약 70%)까지는 지원이 부족합니다.
더 나은 접근 방식은 ASP.net을 배우기 시작할 때 만든 사진 앨범 소프트웨어에서 했던 것처럼 MemoryStream을 가져와 출력하는 별도의 "Image.aspx" 페이지를 사용하는 것입니다.
(웃지 마세요. ASP.net에서의 첫 시도였습니다 :-)
편집하다:ASHX에 동의한 위의 코드는 단지 하나의 샘플 구현을 보여주기 위한 것입니다.사진 앨범을 업데이트하려고 하면 ASHX가 사용됩니다.
ASP.net용 Telerik의 BinaryImage 컨트롤을 사용할 수 있습니다.
여기에 더 많은 정보가 있습니다:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx
아니요.
하지만 해당 이미지를 스트리밍하는 특수 페이지를 만들 수 있습니다.먼저 이미지를 가져올 수 있는 위치를 알려주는 일부 URL 매개변수를 포함하여 스트리밍을 수행하는 페이지에 이미지의 URL을 설정합니다.
<img src="GetImage.aspx?filename=foo" ... />
GetImage.aspx에서는 URL에서 파일 이름(또는 무엇이든)을 가져오고 MemoryStream에 이미지를 로드한 다음 해당 메모리 스트림의 내용을 HttpResponse에 직접 씁니다.
response.Expires = 0;
response.Buffer = false;
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.ContentType = "image/jpeg";
response.BinaryWrite(stream);
response.Flush();
response.Close();
나에게는 @Page에 "buffer="false"를 추가해야 했습니다.안그러면 계속 똑같은 사진만 나올텐데...