2012-01-20 43 views
0

解決了下面的第一個問題,但我仍然需要能夠重新調整大小/重新縮放我的代碼在將物理文件保存到服務器時所用的圖像。現在它已被 存儲在數據庫中它不起作用..重新調整大小並將圖像保存到數據庫中

我在我的代碼中看到我沒有通過重新縮放圖像到InputStream中,我通過原始文件基地..有可能以某種方式傳遞newImage作爲其不同類型的..

我真的有麻煩從數據庫中存儲/檢索圖像。最初,我有允許上傳圖像的代碼,調整到所需的尺寸並將其存儲爲物理文件。但現在我需要將圖像保存到數據庫(MS SQL)。

我使用MVC2 .NET 3.5

我的代碼是有點不同的圖像的跨界混搭上傳所以裸跟我:)

下面是上傳控制器:

[HttpPost] 
public ActionResult ImageUpload(HttpPostedFileBase fileBase, PhotoViewModel photoViewModel) 
{ 
    if (photoViewModel.Button == "Upload") 
    { 
     photoViewModel.ImageValid = "Valid"; 
     ImageService imageService = new ImageService(); 

     if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength <= 2097152 && fileBase.ContentType.Contains("image/")) 
     { 
      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); // Set the JPG Quality percentage 

      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; 
      } 

      //changed this up now, so it stores the image in db as apposed to physical path 
      photoViewModel.photo = newname; 
      photoViewModel.ContentType = fileBase.ContentType; 
      Int32 length = fileBase.ContentLength; 
      byte[] tempImage = new byte[length]; 
      fileBase.InputStream.Read(tempImage, 0, length); 
      photoViewModel.ImageData = tempImage;   

      TempImageUpload tempImageUpload = new TempImageUpload(); 
      tempImageUpload.TempImageData = tempImage; 
      tempImageUpload.ContentType = photoViewModel.ContentType; 

      photoViewModel.TempImageId = _service.InsertImageDataBlob(tempImageUpload); 

      originalImage.Dispose(); 
      streamLarge.Dispose(); 
      return View(photoViewModel); 
     } 

     if (fileBase != null) 
     { 
      if (fileBase.ContentLength > 0) ModelState.AddModelError("Photo", "Image size too small"); 
      if (fileBase.ContentLength <= 2097152) ModelState.AddModelError("Photo", "Image size too big"); 
      if (fileBase.ContentType.Contains("image/")) ModelState.AddModelError("Photo", "Wrong Image Type"); 
     } 
     else ModelState.AddModelError("Photo", "Please upload a image"); 

     if (!ModelState.IsValid) 
     { 
      photoViewModel.ImageValid = "Not Valid"; 
      return View(photoViewModel); 
     } 
    } 
    return View(photoViewModel); 
} 

這裏是我的倉庫類:

public int InsertImageDataBlob(TempImageUpload tempImageUpload) 
{ 
    int ReturnedPhotoId; 

    try 
    { 
    var phototempdata = new Photo 
      { 
        ImageData = tempImageUpload.TempImageData, 
        contentType = tempImageUpload.ContentType, 
        dateUploaded = DateTime.Now 
      }; 
    _db.Photos.InsertOnSubmit(phototempdata); 
    Save(); 
    ReturnedPhotoId = phototempdata.id; 
    return ReturnedPhotoId; 
    } 
    catch (Exception ex) 
    { 
    //ErrorLogging; 
    } 
    return 0; 
} 

和圖像數據數據庫中的字段(圖像類型)將填充數據。

任何援助將不勝感激,我正在逐漸變灰!

感謝

+0

通過這個http://stackoverflow.com/questions/880515/display-image-from-database-in-asp-mvc – maztt

+1

去嘗試把'fileBase .InputStream.Seek(0,SeekOrigin.Begin);'b efore'fileBase.InputStream.Read(tempImage,0,length);'語句? –

+1

您正在從同一個流中讀取兩次,可能在DB中存儲空字節。 –

回答

1

事實上,我也與此代碼的工作:

 photoViewModel.photo = newname; 
     photoViewModel.ContentType = fileBase.ContentType; 
     streamLarge.Position = 0; 
     byte[] tempImage = new byte[streamLarge.Length + 1]; 
     streamLarge.Read(tempImage, 0, tempImage.Length); 
     photoViewModel.ImageData = tempImage; 
+1

ahh ..我看到... tempImage.Length的閱讀和加1的字節數組...你有它..蜜蜂:-)。 – glenn

1

可能它works..or不:-P ....我在你的旁路代碼更改/重新調整的問題(檢查我的評論在您的代碼):

[HttpPost] 
public ActionResult ImageUpload(HttpPostedFileBase fileBase, PhotoViewModel photoViewModel) 
{ 
    if (photoViewModel.Button == "Upload") 
    { 
     photoViewModel.ImageValid = "Valid"; 
     ImageService imageService = new ImageService(); 

     if (fileBase != null && fileBase.ContentLength > 0 && fileBase.ContentLength <= 2097152 && fileBase.ContentType.Contains("image/")) 
     { 
      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); // Set the JPG Quality percentage 

      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; 
      // change from originalImage to newImage 
      g.DrawImage(newImage, 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; 
      } 

      //changed this up now, so it stores the image in db as apposed to physical path 
      photoViewModel.photo = newname; 
      photoViewModel.ContentType = fileBase.ContentType; 
      // using the memoryStream streamLarge 
      // old code: Int32 length = fileBase.ContentLength;   
      byte[] tempImage = new byte[streamLarge.Length]; 
      // replace fileBase.InputStream with streamLarge 
      streamLarge.Read(tempImage, 0, length); 
      photoViewModel.ImageData = tempImage;   

      TempImageUpload tempImageUpload = new TempImageUpload(); 
      tempImageUpload.TempImageData = tempImage; 
      tempImageUpload.ContentType = photoViewModel.ContentType; 

      photoViewModel.TempImageId = _service.InsertImageDataBlob(tempImageUpload); 

      originalImage.Dispose(); 
      streamLarge.Dispose(); 
      return View(photoViewModel); 
     } 

     if (fileBase != null) 
     { 
      if (fileBase.ContentLength > 0) ModelState.AddModelError("Photo", "Image size too small"); 
      if (fileBase.ContentLength <= 2097152) ModelState.AddModelError("Photo", "Image size too big"); 
      if (fileBase.ContentType.Contains("image/")) ModelState.AddModelError("Photo", "Wrong Image Type"); 
     } 
     else ModelState.AddModelError("Photo", "Please upload a image"); 

     if (!ModelState.IsValid) 
     { 
      photoViewModel.ImageValid = "Not Valid"; 
      return View(photoViewModel); 
     } 
    } 
    return View(photoViewModel); 
} 
+0

嗨丹尼爾,它不喜歡這一行:streamLarge.Read(tempImage,0,length); 當前上下文中不存在名稱「長度」 另外,如果我傳入filebase.ContentLength,則在提交圖像時會出現此錯誤:「偏移量和長度超出數組的範圍或計數更大而不是從索引到源集合末尾的元素數量。「 – beebul

+0

如果我嘗試並通過streamLarge.Read(tempImage,0,tempImage.Length);它不會失敗,但沒有圖像返回(圖像之前,雖然太大了,但返回到視圖) – beebul

+0

賞金獎,因爲它幫助我足以達到解決方案。所以謝謝! :) – beebul

相關問題