1

我正在编写自己的服务器端控件。我需要在此控件中使用一些图像。如何写入输出图像文件[或任何其他文件]然后访问它?

       protected override void RenderContents(HtmlTextWriter output)
    {
       .......
       output.Write("some file");
       string endResult = "<img src= how to access this file? />"
       output.Write(endResult);
    }
4

1 回答 1

4

选项 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 编写。

于 2012-10-27T19:03:35.763 回答