オプション1:直接埋め込む
データURIを使用して、画像(およびその他のファイル)をWebページに直接埋め込むことができます。何かのようなもの:
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:メモリに保存し、2ページ目から提供する
生データを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で記述します。