2012-01-05 61 views
2

一个有图片上传功能适用于本地主机正常,但当我尝试和Windows Server 2003下运行,我得到错误信息一般性错误+

这是代码..

现在任何人在我面前跳;)我已经看了前面的答案,我已经检查了所有的权限,他们似乎是正确的..文件夹/路径存在,等等。

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

我知道你说不要跳,但只是为了排除不良的权限的可能性,你可以试着写一个测试文件(任何内容)在同一个位置。 – 2012-01-05 10:40:32

+0

如果您收到错误消息,请添加您收到的消息 – Reniuz 2012-01-05 10:45:14

+0

@Reniuz:GDI中发生了一般性错误+ – beebul 2012-01-05 10:47:35

回答

3

随着Image.FromStream中,流必须在图像的整个生命周期内保持打开状态。这意味着如果流是一个文件,文件将保持打开状态。我认为您需要处理uploadedImage以允许关闭流(如果您等待GC清理uploadedImage,这将在未来发生的不确定时刻发生 - 或根本不会发生)。

+0

那么GC.Collect();帮帮我? – beebul 2012-01-05 10:54:35

+2

我不会推荐它(它使用大锤来破解坚果)。只需在不需要时处理它。 – 2012-01-05 23:27:49

+0

谢谢你帮助干杯贾森! – beebul 2012-01-06 10:03:43