2012-01-05 2 views
2

А имеет функцию загрузки изображения, которое отлично работает на локальном хосте, но когда я пытаюсь и работать под управлением Windows Server 2003 я получаю сообщение об ошибкеобщая ошибка произошла в GDI +

Это код ..

сейчас прежде чем кто прыгает на меня;) Я посмотрел на предыдущие ответы, и я проверил все разрешения, и они кажутся правильными .. папка/существуют пути и т.д ..

ImageService imageService = new ImageService(); 

if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength <= 2097152 && fileBase.ContentType.Contains("image/")) 
{ 
    var uploadedPath = "~/Assets/Images/"; 

    Path.GetExtension(fileBase.ContentType); 
    var extension = Path.GetExtension(fileBase.FileName); 

    if (extension.ToLower() != ".jpg" && extension.ToLower() != ".gif") // only allow these types 
    { 
     photoViewModel.ImageValid = "Not Valid"; 
     ModelState.AddModelError("Photo", "Wrong Image Type"); 
     return View(photoViewModel); 
    } 

    EncoderParameters encodingParameters = new EncoderParameters(1); 
    encodingParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); 

    ImageCodecInfo jpgEncoder = imageService.GetEncoderInfo("image/jpeg"); 
    var uploadedimage = Image.FromStream(fileBase.InputStream, true, true); 

    Bitmap originalImage = new Bitmap(uploadedimage); 
    Bitmap newImage = new Bitmap(originalImage, 274, 354); 

    Graphics g = Graphics.FromImage(newImage); 
    g.InterpolationMode = InterpolationMode.HighQualityBilinear; 
    g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height); 

    var streamLarge = new MemoryStream(); 
    newImage.Save(streamLarge, jpgEncoder, encodingParameters); 

    var fileExtension = Path.GetExtension(extension); 
    string newname; 
    if (photoViewModel.photoURL != null) 
    { newname = photoViewModel.photoURL; } 
    else 
    { newname = Guid.NewGuid() + fileExtension; } 

    var ImageName = newname; 
    newImage.Save(Server.MapPath(uploadedPath) + ImageName); 
    System.IO.File.WriteAllBytes(Server.MapPath(uploadedPath) + ImageName, streamLarge.ToArray()); 

    photoViewModel.uploadedPath = uploadedPath; 
    photoViewModel.photoURL = ImageName; 

    originalImage.Dispose(); 
    newImage.Dispose(); 
    streamLarge.Dispose(); 
    return View(photoViewModel); 
} 
+1

Я знаю, что вы сказали, что не прыгайте, но просто чтобы исключить возможность неправильных разрешений, вы можете просто попробовать написать тестовый файл (любой контент) в том же месте. –

+0

Если вы получаете сообщение об ошибке, пожалуйста, добавьте, какое сообщение вы получаете – Reniuz

+0

@Reniuz: Общая ошибка произошла в GDI + – beebul

ответ

3

с Image.FromStream, то поток должен оставаться открытым для времени жизни изображения. Это означает, что если поток является файлом, файл будет открыт. Я думаю, вам нужно будет загрузить uploadedImage, чтобы позволить потоку быть закрытым (если вы ждете, что GC очистит uploadedImage, это произойдет в неопределенной точке в будущем - или может вообще не произойти).

+0

Так будет GC.Collect(); Помогите? – beebul

+2

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

+0

Спасибо, это помогло Cheers Jason! – beebul

Смежные вопросы