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を使用して、画像(およびその他のファイル)を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で記述します。

于 2012-10-27T19:03:35.763 に答える