【解決方法】ashx ハンドラーからイメージを動的にロードする


アップロードされた画像をシステムフォルダーに保存する画像アップロード機能があります。 アップロードされた画像はページにも表示されるはずです。システムフォルダーから画像を取得するには、ashx の助けを借りましたが、画像はページの読み込み時に正しく読み込まれています。 次に、gdvPartner_SelectedIndexChanged で画像を動的に取得したいと思います。 助けてください。

私が試したこと:

ASP.NET
<tr align="center" style="height:40">
<td class="FormLabels" align="right" style="vertical-align: top">Upload Logo&nbsp;:&nbsp;&nbsp;</td>
    <td align="Left" style="vertical-align: top;width: 30%;padding:5px" colspan="2">
        <telerik:RadAsyncUpload ID="flUpload" runat="server" MaxFileInputsCount="1" AllowedFileExtensions=".png"
            Skin="Web20" Width="200px" />
        <asp:Button ID="btnUpload" runat="server" Style="text-decoration: none; border-radius: 5px;
            border: solid 1px #f39c12;" Text="Upload" CssClass="submitButton" SkinID="Submit"
            OnClick="btnUpload_Click" />
    </td>
    <td  align="Left" colspan="2" style="height: 180px;width: 35%;padding-left:10px">
        <asp:Image Width="200px" Height="150px" runat="server" ImageUrl="../UserControl/GetImage.ashx"
            ID="imgSelectedPhoto" />
    </td>
</tr>
C#
   protected void btnUpload_Click(object sender, EventArgs e)
    {
        if (flUpload.UploadedFiles.Count != 0)
        {
                SaveAsThumbNail();
        }
    }

/// <summary>
/// for saving employee photo
/// </summary>
private void SaveAsThumbNail()
{
    Common cmnObj = new Common();
    try
    {
        string serPath = Utilities.DecryptString(cmnObj.RetriveKeyFromSettingsTable("PartnerLogoPath"));
        string newFileName = SessionHandler.TempPartnerId;
        newFileName = newFileName + "." + ImageFormat.Png.ToString();
        string imgPath = serPath + "/" + newFileName;
        flUpload.UploadedFiles[0].SaveAs(imgPath);//Saving file
    }
    catch (Exception ex)
    {
        BasePage bp = new BasePage();
        bp.GetErrorMessage("", "", ex, Page.Title, "SaveAsThumbNail");
    }
}

C#
public void ProcessRequest(HttpContext context)
{
    string imgPath = string.Empty;
    string extension = string.Empty;

    Common cmnObj = new Common();
    string serPath = Utilities.DecryptString(cmnObj.RetriveKeyFromSettingsTable("PartnerLogoPath"));

    string newFileName = SessionHandler.TempPartnerId;
    newFileName = newFileName + "." + ImageFormat.Png.ToString();
    imgPath = serPath + "/" + newFileName;
    if (File.Exists(imgPath))
    {
            string contentType = string.Empty;
            imgPath = Convert.ToString(imgPath);
            extension = imgPath.Substring((imgPath.Length - 4), 4).ToLower();
            switch (extension)
            {
                case ".png":
                    contentType = "image/png";
                    break;
                default:
                    break;
            }

        context.Response.ContentType = contentType;
        context.Response.TransmitFile(imgPath);
    }
    else
    {
        context.Response.TransmitFile("~/Images/NoImage.gif");
    }
}

C#
protected void gdvPartner_SelectedIndexChanged(object sender, EventArgs e)
{

C#
string siteHandlerUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + ResolveUrl("~/") + "UserControl/GetImage.ashx";
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create(siteHandlerUrl);
//HttpWebResponse response = (HttpWebResponse)request.GetResponse();
imgSelectedPhoto.ImageUrl = Page.ResolveUrl(siteHandlerUrl);

}

解決策 1

上記のコードに基づくと、ashx は実際には出力ストリームではなくファイルを送信しているため、イメージ コントロールは出力ストリームをイメージに変換できます。

誰かが以下に同様の解決策を投稿しました。
asp.net-C#-リモートイメージをロードし、.ashxファイルを使用してブラウザに送信する – コードログ[^]

それが役に立てば幸い!

コメント

タイトルとURLをコピーしました