我有一个将图像上传到的Web应用程序,该图像随后被保存到服务器的temp文件夹中,并通过webhandler在aspx页面上显示。

aspx的代码:

<img src="PreviewImageQualityHandler.ashx" alt="Picture not loaded" runat="server" id="imagePreview" />


用于上传图片并向会话添加唯一ID的代码:

protected void uploadButton_Click(object sender, EventArgs e)
{
    if (FileUploadControl.FileName.EndsWith(".jpg") || FileUploadControl.FileName.EndsWith(".jpeg"))
    {
        string tempFileName = Path.GetTempFileName();
        FileUploadControl.SaveAs(tempFileName);
        Session["tempName"] = tempFileName;
        Response.Write(Session["tempName"]);
        fileName = FileUploadControl.FileName;
    }
    else
    {
        Response.Write("<script>alert('Please select a .jpg/.jpeg image to upload')</script>");
    }
}


Webhandler代码:

public class PreviewImageQualityHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            if (context.Session.Count > 0)
            {
                string sessID = context.Session["tempName"].ToString();
                Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID);
                context.Response.ContentType = "image/jpg";
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);
                byte[] b = ms.ToArray();
                context.Response.OutputStream.Write(b, 0, b.Length);
            }
        }
        catch(Exception ex)
        {

        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}


我的问题是,Webhandler仅在第一个图像上传时触发。如果我尝试上传新图像,则网络处理程序将永远不会触发。

如果我从Web处理程序中删除与Session有关的所有内容,它将在每次回发时触发,就像应该的那样。

如果有人能够阐明我的问题,我将万分感谢!

问候

弗朗西斯

最佳答案

好的,重写我的答案(如果您以前没有找到答案,请参阅历史记录)。有关代码的一些注意事项:


不要使用Response.Write。您无法确定何时编写,而且通常不会在浏览器中看到它。使用asp:Literal控件或asp:Label代替。与当前问题相关,因为:如果您没有在浏览器中看到它,也许您认为什么都没有发生。
您不能保证文件流的打开/关闭。在其周围添加一个using块,以便正确关闭流并清除流。当前使用的方式,只要线程处于活动状态且相当长,文件就会保持打开状态。

using(Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID))
{
     //.. your code...
     using(MemoryStream.... etc)
     {
         ....
     }
}


无法关闭的问题:您下次将无法将新文件写入相同的位置,可能无法打开该文件进行读取,并且当代码进入时,您将很快用尽可用的文件处理程序生活。
不确定您对会话的期望。但是,最好对图片使用一些ID,将其与当前用户信息一起存储在数据库中,并将其作为请求查询字符串添加到图片URL。这样,您就不会遇到会话问题的麻烦:

<img src="myimage.ashx?id=1234" />


1234指磁盘上的某物,或者指数据库中的某物,而后者又指磁盘上的某物(更安全)。
如果不确定浏览器是否重新发送请求,请将FireBug与FireFox一起使用,它将为您提供HTTP请求和响应的完整详细信息。如果您使用相同的名称,则浏览器将不会(除非您处于调试模式下)每次都发送新请求。
您正在使用一个包罗万象的异常处理程序。在此处写一些东西,或在该位置放置一个断点。包罗万象的异常处理程序非常危险:许多异常永远不会被看到。您的当前代码很可能引发异常(请参见上面的第2点),仅此而已。删除异常处理程序,Visual Studio调试器将捕获该异常,以便您了解发生了什么。


我知道,总共有很多问题。逐一检查它们,看看是否有帮助。至少,您的代码将变得更加稳定。

09-07 00:35