2

当用户在我的表单上按“保存团队”时,我无法将用户上传的图像保存到我的“徽标”文件中。

为了让您了解应用程序的功能,我在这里提供了一个屏幕截图,按下添加团队后,所有文本框数据都将写入文本文件,我希望图像自动保存到预定义的文件夹“logos”中,但是每当我按保存时,我都会收到 GDI++ 错误。

在浏览了网络上的一些旧线程后,我发现这可能是由文件权限、文件大小、文件名甚至打开的流等一些因素引起的。

下面是我目前用来保存提示错误的文件的代码:

     private void btnAddTeam_Click(object sender, EventArgs e)
    {
        //VALIDATION FOR TEXT FILE AND OTHER STUFF HERE...

        //SAVE THE IMAGE FILE
        string filePath = picTeamLogo.ImageLocation;
        Image tempImage = Image.FromFile(filePath);

        tempImage.Save(@"../logos/");
    }

如果您正在查看屏幕截图,请不要对“arsenal.png”感到困惑我知道这不是完整的文件路径,它的转换是用另一种方法处理的,因为只需要将文件名写入文本文件。

如果有人对我哪里出错有任何想法,请指出我正确的方向,模糊的错误,例如我刚刚收到的 GDI 错误,真是令人头疼!


亚历克斯。

4

3 回答 3

2

试试这个方法

 public void storeFile(FileUpload File, string dirName)
    {
        if (!Directory.Exists(MapPath("~/uploads/" + dirName)))
        {
            Directory.CreateDirectory(MapPath("~/uploads/" + dirName));
        }
        string saveLocation = MapPath("~/uploads/" + dirName + "/" +        Path.GetFileName(File.FileName));
        File.SaveAs(saveLocation);


    }
于 2013-04-08T19:03:54.833 回答
1

有关类似问题,请参阅我之前的这篇文章...

Bitmap.Save 方法中的 GDI+ 中发生一般错误

流保持锁定 - 您可以将内存流用作临时位置,然后保存。

从文件构造位图对象或图像对象时,文件在对象的生命周期内保持锁定状态。因此,您无法更改图像并将其保存回其原始文件。 http://support.microsoft.com/?id=814675

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        tempImage.Save(memory, ImageFormat.Jpeg);
        // memory.ToStream(fs) // I think the same
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}

或者替代方法是将图像通过加载MemoryStream到图像中 - 所以流不会首先被锁定......

于 2013-04-08T18:51:07.763 回答
1

那是因为你没有指定保存功能的文件名!

看看这个 :

string filePath = picTeamLogo.ImageLocation;
FileInfo fi = new FileInfo(filePath);
Image tempImage = Image.FromFile(fi.FullName);
tempImage.Save(@"../logo/" + fi.Name);

现在它工作正常

于 2013-04-08T19:01:02.137 回答