【问题标题】:Saving bitmap file to server as jpg将位图文件以 jpg 格式保存到服务器
【发布时间】:2013-10-14 19:05:40
【问题描述】:

我正在尝试在我的服务器上将位图文件保存为 jpg,但无法这样做。我能够将它保存到流中并显示它。但是,一旦我尝试将其保存到文件中,它就什么也做不了。下面是我的代码,谁能告诉我为什么它不保存到文件中:

   protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string jsonStr = Request.Form["output"];

            var sigToImg = new SignatureToImage();
            var signatureImage = sigToImg.SigJsonToImage(jsonStr);

            Bitmap bm2 = signatureImage as Bitmap;
            Bitmap bm3 = new Bitmap(bm2);

            Response.ContentType = "image/jpeg";
            //bm3.Save(Response.OutputStream, ImageFormat.Jpeg); If i use this it displays the image fine

            System.IO.FileStream fs = System.IO.File.Open(Server.MapPath("~/Images") + "MyImage.jpg", FileMode.Create);
            bm3.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
            bm2.Dispose();
            bm3.Dispose();
            Response.End();
        }
    }

【问题讨论】:

  • 我认为您的部分问题是Server.MapPath 将返回一个没有尾随目录分隔符的值。所以你的文件名是"c:\whatever\ImagesMyImage.jpg"。您需要添加干预"\"

标签: c# asp.net bitmap gdi+


【解决方案1】:

确保除了处理位图实例之外,还要关闭正在写入的文件流(在调用 bm3.Save() 之后):

fs.Close();

这会将流刷新到磁盘并确保图像实际包含在文件中。

---编辑---

正如 cmets 中所展示的,这是由于 Server.MapPath 解析到了 Brad 没有预料到的目录。

【讨论】:

  • @BradHazelnut:它是在磁盘上创建文件吗?如果不是,则可能与文件权限有关(即检查是否允许该进程在磁盘上创建文件)。
  • 我授予每个人对该文件夹的完全读写权限,只是为了测试,它不会创建任何东西。
  • @BradHazelnut:尝试对要创建的图像的文件路径进行硬编码,而不是使用Server.MapPath 来解决它,以防解析到您不期望的地方。
  • 你说得对,它会进入不同的目录,我对路径进行了硬编码,它成功了,非常感谢你的帮助。
【解决方案2】:

我建议将 save 方法放在 try/catch 块中:

try
{
   bm3.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch(Exception e)
{
   // Check for errors here
}

保存可以抛出两种异常:

ArgumentNullException 文件名或格式为空。

ExternalException图片保存的图片格式错误

我怀疑第一个正在发生。

【讨论】:

  • 我尝试将此添加到我的代码中,但没有错误或什么也没有,尝试 { System.IO.FileStream fs = System.IO.File.Open(Server.MapPath("~/Images") + "MyImage.jpg", FileMode.Create); bm3.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); fs.Close(); } 捕捉(异常){ }
  • 试试这个 => bw3.FromStream(Response.OutputStream) THEN 调用我上面列出的保存函数。
  • 当我尝试添加该行时出现以下错误:无法使用实例引用访问 System.Drawing.Image.FromStream(System.IO.Stream);改为使用类型名称引用来限定它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多