У меня есть несколько изображений в базе данных SQL Server. Я хочу отображать их, когда пользователь нажимает кнопку, но я хочу, чтобы они загружались в браузер в виде файла, чтобы при изменении размера окна пользователь автоматически изменял размеры изображений.
Например, в Firefox, если вы зайдете в File-> Open File ... и выберите изображение на вашем компьютере, оно загрузит его в новое окно и изменит его размер при перетаскивании полос прокрутки. Моя проблема заключается в том, как получить изображение для загрузки из базы данных SQL Server в браузер в виде файла? У меня есть следующий код в форме, где пользователь щелкает представление в GridView:
<script type="text/javascript">
function ShowImageInNewPage(url_add) {
window.open(url_add, 'ViewScreenshot', 'resizable=yes,scrollbars = yes');
}
</script>
<asp:GridView
ID="grdTrades"
runat="server"
<... removed some properties for brevity ...>
>
<Columns>
<asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
<.. removed some columns for brevity ...>
<asp:TemplateField HeaderText="Screenshot" >
<ItemTemplate>
<input type="button" size="x-small" value="View" onclick="javascript:ShowImageInNewPage('DisplayImage.aspx?screenshotId=<%# Eval("screenshotId") %>');" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
DisplayImage.aspx имеет этот код:
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["screenshotId"] != null)
{
int screenshotId= int.Parse(Request.QueryString["screenshotId"]);
imgScreenshot.ImageUrl = "App_Handlers/ImageHandler.ashx?screenshotId=" + screenshotId;
}
}
</script>
<html>
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Image ID="imgScreenshot" runat="server" />
</div>
</form>
</body>
</html>
App_Handlers / ImageHandler.ashx имеет этот код:
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.Web;
using System.Data;
using DatabaseComponent;
public class ImageHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
if (context.Request.QueryString["screenshotId"] != null)
{
int screenshotId = int.Parse(context.Request.QueryString["screenshotId"]);
DBUtil DB = new DBUtil();
DataTable dt = DB.GetScreenshot(screenshotId);
if (dt != null)
{
Byte[] bytes = (Byte[])dt.Rows[0]["screenshot"];
context.Response.Buffer = true;
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = dt.Rows[0]["contentType"].ToString();
context.Response.AddHeader("content-disposition", "attachment;filename=" + dt.Rows[0]["fileName"].ToString());
context.Response.BinaryWrite(bytes);
context.Response.Flush();
context.Response.End();
}
}
}
public bool IsReusable {
get {
return false;
}
}
}
Вот заголовки ответа для DisplayImage.aspx
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 10 Nov 2010 13:13:37 GMT
X-AspNet-Version: 4.0.30319
Transfer-Encoding: chunked
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: image/JPG
Connection: Close
Я изменил свой первоначальный вопрос, чтобы теперь использовать обработчик изображений, спасибо @leppie. Спасибо за внимание!
UPDATE
Я теперь изменил DisplayImage.aspx на этот код, но теперь я получаю немного странное поведение. Когда я нажимаю на ссылку с изображением, эта страница загружается, и Firefox спрашивает, хочу ли я сохранить DisplayImage.aspx. Что здесь происходит? Как я могу заставить Firefox загрузить изображение в виде файла?
DisplayImage.aspx:
<%@ Page Language="C#" ContentType="image/*" %>
<script runat="server">
</script>
<html>
<head runat="server">
<title></title>
</head>
<body>
<img src="App_Handlers/ImageHandler.ashx?screenshotId=<%=Request.QueryString["screenshotId"]%>" />
</body>
</html>
Если я удаляю ContentType из объявления страницы, изображение загружается в новое окно, однако изображение не будет масштабироваться и не будет изменять свой размер. Вытаскивая мои волосы ...