选项 1:直接嵌入
您可以使用数据 URI将图像(和其他文件)直接嵌入到网页中。就像是:
protected override void RenderContents(HtmlTextWriter output)
{
............
byte[] rawImgData = []; //add your data here, maybe from a FileStream
String imgMimeType = "[img mime type, eg image/png]";
String encodedImgData = Convert.ToBase64String(rawImageData);
output.Write(String.Format("<img src=\"data:{0},{1}\" />", imageMimeType, encodedImageData))
}
如链接中所述,这种方法有很多缺点。如果您将为控件的每个请求提供相同的图像,那么您应该真正使用静态文件。
选项2:保存到服务器并映射它
假设您的 IIS 工作人员帐户(通常称为 IUSR)对服务器上的某个位置具有写入权限,您可以将其保存Server.MapPath
并发送实际链接。
protected override void RenderContents(HtmlTextWriter output)
{
............
byte[] rawImgData = []; //add your data here, maybe from a FileStream
FileStream fileStream = System.IO.File.Create(Server.MapPath(virtualPath))
fileStream.Write(rawImgData, 0, rawImgData.Length)
fileStream.Close()
output.Write(String.Format("<img src=\"{0}\" />", virtualPath))
}
对于重复请求,这绝对是最佳选择。
选项 3:将其存储在内存中并通过第二页提供服务
您可以将原始数据存储在Session
(或您选择的另一个临时内存存储)中,发送带有标识符的链接,然后从另一个页面提供服务。就像是:
protected override void RenderContents(HtmlTextWriter output)
{
............
byte[] rawImgData = []; //add your data here, maybe from a FileStream
Session["MyImgTempStorage"] = rawImgData;
output.Write("<img src=\"ServeImgTempStorage.ashx?file=MyImgTempStorage\");
}
并制作一个名为 ServeImgTempStorage.ashx 的通用处理程序,如下所示:
public class ServeImgTempStorage : System.Web.IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string fileKey = context.Request.QueryString("file");
if (string.IsNullOrEmpty(fileKey)) {
return;
}
byte[] rawData = context.Session(fileKey);
context.Response.Write(rawData);
context.Response.ContentType = "[your mime type. you can force a download with attachment;]";
context.Response.End();
}
public bool IsReusable {
get { return false; }
}
}
您需要确保对以这种方式提供的每个文件都使用会话唯一标识符,否则您将覆盖数据。
注意:我的 C# 语法可能不正确,我通常用 VB 编写。