2012-01-20 2 views
0

아래 첫 번째 문제가 해결되었지만 실제 파일을 서버에 저장할 때 사용했던 코드의 이미지 크기를 다시 조정할 수 있어야합니다. . 이제는 이 데이터베이스에 저장되어 작동하지 않습니다.이미지를 데이터베이스로 다시 저장

내 코드에서 볼 수 있듯이 다시 조정 된 이미지를 InputStream에 전달하지 않고 원본 파일을 전달합니다. newImage를 다른 유형의 것으로서 어떤 식 으로든 전달할 수 있습니다.

데이터베이스에서 이미지를 저장/검색하는 데 실제적인 문제가 있습니다. 처음에는 이미지를 업로드하고 필요한 크기로 크기를 조정하고 실제 파일로 저장할 수있는 코드가있었습니다. 하지만 지금은 이미지를 데이터베이스 (MS SQL)에 저장해야합니다.

나는 MVC2 .NET을 사용하고 3.5

내 코드가 다른 이미지의 매쉬업의 비트가 나와 있으므로 맨손으로 업로드됩니다 :) 여기

업로드은 컨트롤러 :

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

그리고 이미지 데이터 :

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

여기 내 저장소 클래스의 데이터베이스의 필드 (이미지 유형)에 데이터가 채워집니다.

모든 도움을 주시면 감사하겠습니다. 점차 회색으로 갈 것입니다 !!

감사

아마
+0

이 http://stackoverflow.com/questions/880515/display-image-from-database-in-asp-mvc – maztt

+1

통해 간 : 나는 실제로이 코드와 함께 작동하도록 있어요 .InputStream.Seek (0, SeekOrigin.Begin);'b efore'fileBase.InputStream.Read (tempImage, 0, length);'문장? –

+1

동일한 스트림에서 두 번 읽는 중입니다. 빈 바이트를 저장하는 DB에있을 수 있습니다. –

답변

1

을 `fileBase를 넣어보십시오

 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

아아......... 볼 수있는 tempImage.Length. 바이트 배열에 대한 읽기 및 플러스 1 .... 당신은 그것을 가지고 있습니다. 좋은 꿀벌 :-). – glenn

1

는 P는하지 works..or .... 우회에 대한 코드에서 내 변화/문제 (코드에서 내 의견을 확인) 스케일링 :

[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); 이름 'length'이 (가) 현재 컨텍스트에 존재하지 않습니다. 또한 filebase.ContentLength를 전달하면 이미지를 제출할 때이 오류가 발생합니다. "오프셋 및 길이가 배열의 범위를 벗어나거나 개수가 더 많습니다. 인덱스에서 소스 컬렉션의 끝에 이르는 요소의 수보다 큽니다. " – beebul

+0

시도해보고 streamLarge.Read (tempImage, 0, tempImage.Length)를 전달하면; 그것은 실패하지는 않지만 이미지가 반환되지 않습니다 (이미지 앞에 너무 크지 만 뷰에 반환 됨). – beebul

+0

Bounty는 솔루션에 도달하는 데 충분한 도움을주었습니다. 고마워! :) – beebul

관련 문제