我创建了一个生成位图的类(Draw.aspx)并在请求响应中返回它:
Response.ContentType = "image/png";
bitmap.Save(Response.OutputStream, ImageFormat.Png);
一切都很好,当我在我的网络浏览器中运行Draw.aspx它显示生成的图像,我可以将它保存在我的硬盘上等...
现在我想从另一个站点(〜/ default.aspx)调用此请求,并从那里将此图像保存到服务器(例如image.png)或在网站中使用它。我试图运行这段代码,但问题是我得到了Draw.aspx的.html部分,而不仅仅是.png:
String inputImage = Server.MapPath("Draw.aspx");
String outputImage = Server.MapPath("image.png");
WebRequest webRequest = WebRequest.Create(inputImage);
WebRequest.Create(inputImage);
webRequest.Method = "GET";
webRequest.ContentType = "image/png; encoding='utf-8'";
WebResponse webResponse = webRequest.GetResponse();
StreamReader oReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
StreamWriter oWriter = new StreamWriter(outputImage);
oWriter.Write(oReader.ReadToEnd());
什么image.png文件包含(而不是实际图像):
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Draw.aspx.cs" Inherits="Draw" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
我一直在努力解决这个问题几个小时,但似乎没有什么工作正常,我认为我可能会误解请求回复是如何工作的。
我真的很感激任何帮助:)
答案 0 :(得分:1)
您正在尝试下载图片,因此请使用图像对象!
ImageFeeder.ashx(注意:这就是我所谓的文件,它会吐出图像。相应地重命名):
<%@ WebHandler Language="C#" Class="ImageFeeder" %>
using System;
using System.Drawing;
using System.IO;
using System.Web;
public class ImageFeeder : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "image/png";
context.Response.Clear();
context.Response.BufferOutput = true;
MemoryStream m = new MemoryStream();
Image i = Image.FromFile(@"C:\Path\to\image.PNG");
i.Save(m, System.Drawing.Imaging.ImageFormat.Png);
context.Response.BinaryWrite(m.ToArray());
}
public bool IsReusable {
get {
return false;
}
}
}
然后在您的其他页面中,只使用图像对象。例如,从默认的aspx表单页面开始:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
在代码隐藏中创建一个图像,并用它做任何你想做的事情。例如:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Image i = new Image();
i.ImageUrl = "ImageFeeder.ashx";
// Now do whatever you want with it.
form1.Controls.Add(i);
}
}
图像将插入到表单标记内的div之后。由于它是一个图像对象,你可以随心所欲地做任何事情......显示它,保存它等等。
这很容易!
修改强>
保存图像稍微困难一点,但不是很多。首先,您需要一个WebClient
对象,然后使用A:您的图像输送器的完整URL下载文件,B:您想要保存的绝对路径。让我们假设您在特殊端口上运行localhost(就像在VS中开发一样),并且您希望将映像转储到与其他所有目录相同的目录中。您在代码隐藏中最终得到了这个:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
WebClient wc = new WebClient();
wc.DownloadFile("http://localhost:61579/ImageFeeder.ashx", Path.Combine(Server.MapPath("."), "myimage.png"));
}
}
显然,您还需要所有using
语句。