У меня есть функция, которая сначала считывает изображение с диска, изменяет его размер, а затем сохраняет в другой каталог.

Когда я использую Bitmap.Save (каталог + имя изображения), он возвращает ошибку, как я указал в заголовке вопроса.

Я проверил, что каталог правильный, и данное имя изображения не существует в этом каталоге.

Что странно, так это то, что тот же код отлично работает на локальной машине. но когда я загружаю его на свой общий хостинг, он просто не работает.

Код ниже.

bmpOut = new Bitmap(Size, Size);
Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.White, 0, 0, Size, Size);
int topBottomPadding = 0; int leftRightPadding = 0;
if (Size > lnNewWidth + 1)
    leftRightPadding = Convert.ToInt32((Size - lnNewWidth) / 2);
else if (Size > lnNewHeight + 1)
    topBottomPadding = Convert.ToInt32((Size - lnNewHeight) / 2);
g.DrawImage(loBMP, leftRightPadding, topBottomPadding, lnNewWidth, lnNewHeight);
Bitmap bmp = new Bitmap(bmpOut);
if (bmp != null)
    bmp.Save(ResizedOutput); // C:\Inetpub\vhosts\DomainName\httpdocs\ProductImages\500px\gigabyte_ga_ep45_ds4_profilelarge[1].jpg
bmp.Dispose();
bmpOut.Dispose();
g.Dispose();
loBMP.Dispose();

Трассировки стека:

[ExternalException (0x80004005): A generic error occurred in GDI+.]
   System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) +377630
   System.Drawing.Image.Save(String filename, ImageFormat format) +69
   System.Drawing.Image.Save(String filename) +25
   Utilities.ResizeImage(String fileName, String mode) in c:\inetpub\vhosts\batuhanakcay.com\httpdocs\App_Code\Utilities.cs:181
   Link.ToProductImage(String fileName) in c:\inetpub\vhosts\batuhanakcay.com\httpdocs\App_Code\Link.cs:79
   Product.PopulateControls(ProductDetails pd) in c:\inetpub\vhosts\batuhanakcay.com\httpdocs\Product.aspx.cs:37
   Product.Page_Load(Object sender, EventArgs e) in c:\inetpub\vhosts\batuhanakcay.com\httpdocs\Product.aspx.cs:20
6
Batu 12 Мар 2010 в 11:14

2 ответа

Лучший ответ

Из ASP Net - GDI + и СОХРАНИТЬ JPG или BMP на сервере

В 99,9% случаев при использовании GDI «общая ошибка произошла» означает, что каталог, в который вы пытаетесь сохранить, не имеет надлежащих разрешений. Как правило, необходимо убедиться, что каталог позволяет ASP.NET изменять файлы.

Вы разрешения проверяли?

15
Sofia Rodrigues 3 Апр 2019 в 15:03
Как глупо с моей стороны, я копался в своем коде в течение 2 дней, пытаясь найти, черт возьми, не так. Вы правы, это должно быть первое, что я проверил. Я просто даю пользователю «Plesk IIS WP User (IWAM_plesk (по умолчанию)) полное разрешение», и он работает. Благодарю.
 – 
Batu
12 Мар 2010 в 11:31
1
ТАК предназначена быть вашей второй парой глаз X-)
 – 
Adriaan Stander
12 Мар 2010 в 11:35
Как я могу это проверить?
 – 
Piero Alberto
21 Июн 2018 в 14:46
Я исправил ошибку, удалив изображение в элементе управления Picturebox, созданное с помощью GDI +.
 – 
Stefan Đorđević
20 Дек 2020 в 21:40

Эта ошибка также возникает при попытке сохранить в общей сетевой папке. Единственное решение исправить это - переместить растровое изображение в поток памяти и сохранить его вместе с файловым потоком в сетевой папке.

Вот способ расширения, чтобы легко это исправить:

public static void SaveOnNetworkShare(this System.Drawing.Image aImage, string aFilename, 
  System.Drawing.Imaging.ImageFormat aImageFormat)
{
  using (System.IO.MemoryStream lMemoryStream = new System.IO.MemoryStream())
  {
    aImage.Save(lMemoryStream, aImageFormat);

    using (System.IO.FileStream lFileStream = new System.IO.FileStream(aFilename, System.IO.FileMode.Create))
    {
      lMemoryStream.Position = 0;

      lMemoryStream.CopyTo(lFileStream);
    }
  }      
}
2
ViRuSTriNiTy 2 Окт 2015 в 16:51