public ImageProcessResult ProcessImage(FileStreamDto profileImage) { var retVal = new ImageProcessResult(); ValidateExtension(profileImage.FileName); using (Image image = Image.FromStream(profileImage.Stream)) { ValidateImageSize(image); //We know the image input will always be bigger than thumbnail retVal.ThumbnailImage = GetResizedImage(image, THUMBNAIL_RESOLUTION, THUMBNAIL_RESOLUTION); retVal.MediumImage = GetResizedImage(image, MEDIUM_RESOLUTION_WIDTH, MEDIUM_RESOLUTION_HEIGHT); if ((image.Width >= retVal.MediumImage.Width + 50 && image.Width >= FULL_RESOLUTION_WIDTH) || (image.Height >= retVal.MediumImage.Height + 50 && image.Height >= FULL_RESOLUTION_HEIGHT)) { //the + 50 means don't create a full size image if it's barely bigger than a medium sized one retVal.FullImage = GetResizedImage(image, FULL_RESOLUTION_WIDTH, FULL_RESOLUTION_HEIGHT); } } return retVal; }
public int UploadInterests(FileStreamDto fileStream) { int retVal; using (var sr = new StreamReader(fileStream.Stream)) { try { var csvData = new CSV(sr.ReadToEnd()); //skip the first row var interestData = csvData .Rows .Skip(1) .Where(x=> !string.IsNullOrWhiteSpace(x.Cells[0].Value)) .Select( x => { string interestName1 = x[0].Value; if (string.IsNullOrWhiteSpace(interestName1)) throw new RulesException("Interest 1","Interest cannot be missing"); var interest = _interestRepository.GetByName(interestName1) ?? Create(interestName1, null); var dto1 = new RelatedInterestListDto.RelatedInterestDto(interest.Id, null, interest.Name, interest.Slug); string interestName2 = x[1].Value; if (string.IsNullOrWhiteSpace(interestName2)) throw new RulesException("Interest 2", "Interest cannot be missing"); interest = _interestRepository.GetByName(interestName2) ?? Create(interestName2, null); var dto2 = new RelatedInterestListDto.RelatedInterestDto(interest.Id, null, interest.Name, interest.Slug); return new { Interest1 = dto1, Interest2 = dto2, Weight = int.Parse(x[2].Value) }; }) .ToList(); retVal = interestData.Count; foreach (var data in interestData) { CreateRelationships( new RelatedInterestListDto { OriginalInterest = data.Interest1, WeightedRelatedInterestDtos = new List<RelatedInterestListDto.WeightedRelatedInterestDto> { new RelatedInterestListDto.WeightedRelatedInterestDto { Interest = data.Interest2, Weight = EnumExtensions.GetInterestRelationshipWeight(data.Weight) } } }); } } catch (FormatException) { throw new RulesException("Weight", "Every row needs to have a proper weight"); } } return retVal; }
public ActionResult SaveProfileImage(HttpPostedFileBase profileImage) { //http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx //model bound //TODO:put this into a viewmodel and check for is valid User user = _userTasks.GetUser(_principal.Identity.Name); if (profileImage == null) { ViewData.ModelState.AddModelError("Image", "You need to provide a file first... or don't. Have it your way."); RouteData.Values["action"] = "Index"; return Index(_principal.Identity.Name); } else { try { var fileStreamDto = new FileStreamDto(profileImage.InputStream, profileImage.FileName); _userTasks.SaveProfileImage(user, fileStreamDto); } catch (RulesException rex) { //TODO: Implement PRG pattern for post forms //TODO: Log These exceptions in elmah rex.AddModelStateErrors(ModelState); RouteData.Values["action"] = "Index"; return Index(_principal.Identity.Name); } finally { profileImage.InputStream.Dispose(); } } return RedirectToAction("Index"); }
public ActionResult SaveInterestImage(UserSaveInterestImageViewModel userSaveInterestImageViewModel) { User user = _userTasks.GetUser(_principal.Identity.Name); if (userSaveInterestImageViewModel.InterestImage == null) //TODO: use required/not-null attribute instead of checking for null { ViewData.ModelState.AddModelError("Image", "You need to provide a file first... or don't. Have it your way."); RouteData.Values["action"] = "Interests"; return Interests(_principal.Identity.Name); } else { try { var fileStreamDto = new FileStreamDto(userSaveInterestImageViewModel.InterestImage.InputStream, userSaveInterestImageViewModel.InterestImage.FileName); _userTasks.PostImage(user, fileStreamDto, userSaveInterestImageViewModel.UserInterestId, userSaveInterestImageViewModel.ImageDescription); } catch (RulesException rex) { //TODO: Implement PRG pattern for post forms //TODO: Log These exceptions in elmah rex.AddModelStateErrors(ModelState); RouteData.Values["action"] = "Interests"; return Interests(_principal.Identity.Name); } finally { userSaveInterestImageViewModel.InterestImage.InputStream.Dispose(); } } return RedirectToAction("Interests"); }
private void SaveImageForUser(FileStreamDto profileImage, string metaPrefix, Action<ImageFileNamesDto> afterProcessing) { if (afterProcessing == null) throw new ArgumentNullException("afterProcessing"); //be very safe with image streams var exceptions = new List<Exception>(); ImageProcessResult result = null; try { var newImageFileNames = new ImageFileNamesDto(); result = _imageProcessor.ProcessImage(profileImage); bool fullFileExists = result.FullImage != null; var files = new List<FileToUpload> { new FileToUpload(result.ThumbnailImage.Image, "thumb_" + profileImage.FileName, metaPrefix + "-" + "Thumb"), new FileToUpload(result.MediumImage.Image, "med_" + profileImage.FileName, metaPrefix + "-" + "Medium") }; if (fullFileExists) { files.Add(new FileToUpload(result.FullImage.Image, "full_" + profileImage.FileName, metaPrefix + "-" + "Full")); } IList<string> filePaths = _fileUploadService.UploadFiles("Images/", files); newImageFileNames.ThumbFilename = filePaths[0]; newImageFileNames.MediumFilename = filePaths[1]; newImageFileNames.FullFilename = filePaths[fullFileExists ? 2 : 1]; afterProcessing(newImageFileNames); } catch (RulesException) { throw; } catch (Exception ex) { exceptions.Add(ex); } finally { if (result != null) { DisposeImageIfNotEmpty(result.ThumbnailImage, exceptions); DisposeImageIfNotEmpty(result.MediumImage, exceptions); DisposeImageIfNotEmpty(result.FullImage, exceptions); } } if (exceptions.Any()) { throw new AggregateException("Error processing image", exceptions); } }
public void SaveProfileImage(User user, FileStreamDto profileImage) { ImageFileNamesDto originalImageNames = null; if (user.ProfileImage != null) { originalImageNames = GetImageFileNamesDto(user.ProfileImage); } SaveImageForUser( profileImage, user.Username + "-Profile-Image", imgFileNamesDto => { user.UpdateProfileImage(new ImageData(profileImage.FileName, imgFileNamesDto.ThumbFilename, imgFileNamesDto.MediumFilename, imgFileNamesDto.FullFilename)); if (originalImageNames != null) { DeleteImages(originalImageNames); } }); }
public void PostWebPage(User user, int userInterestId, string linkUrl) { UserInterest interest = user.Interests.First(x => x.Id == userInterestId); linkUrl = linkUrl.FormatWebAddress(); string html = _webContentService.GetHtmlFromUrl(linkUrl); PageDetails details = _pageParsingService.GetDetails(html); string description = details.Description; var uri = new Uri(linkUrl); var domain = uri.GetLeftPart(UriPartial.Authority).Replace(uri.GetLeftPart(UriPartial.Scheme), ""); var medium = new WebPage { LinkUrl = linkUrl, WebPageDomainName = domain, Title = details.Title, CreateDate = DateTime.UtcNow }; var post = new Post { Description = description, CreateDate = DateTime.UtcNow, Medium = medium }; //determine if image is available if (!string.IsNullOrWhiteSpace(details.ImageUrl)) { byte[] data = _webContentService.GetDataFromUrl(details.ImageUrl); string fileName = Path.GetFileName(details.ImageUrl); using (var memoryStream = new MemoryStream(data)) { var fileStreamDto = new FileStreamDto(memoryStream, fileName); SaveImageForUser( fileStreamDto, user.Username + "-Interest-WebPage-Image-" + interest.Interest.Name, imgFileNamesDto => medium.AddImage( new ImageData(fileName, imgFileNamesDto.ThumbFilename, imgFileNamesDto.MediumFilename, imgFileNamesDto.FullFilename))); } } user.AddPost(post, interest.Interest); }
public void PostVideo(User user, int userInterestId, string videoUrl) { UserInterest interest = user.Interests.First(x => x.Id == userInterestId); videoUrl = videoUrl.FormatWebAddress(); string html = _webContentService.GetHtmlFromUrl(videoUrl); PageDetails details = _pageParsingService.GetDetails(html); string description = details.Description; if (string.IsNullOrWhiteSpace(details.VideoUrl)) { throw new RulesException("Description", "Invalid video"); } var medium = new Video { VideoUrl = details.VideoUrl, Title = details.Title, CreateDate = DateTime.UtcNow }; var post = new Post { Medium = medium, Description = description, CreateDate = DateTime.UtcNow }; //determine if image is available if (!string.IsNullOrWhiteSpace(details.ImageUrl)) { byte[] data = _webContentService.GetDataFromUrl(details.ImageUrl); string fileName = Path.GetFileName(details.ImageUrl); using (var memoryStream = new MemoryStream(data)) { var fileStreamDto = new FileStreamDto(memoryStream, fileName); SaveImageForUser( fileStreamDto, user.Username + "-Interest-Video-Image-" + interest.Interest.Name, imgFileNamesDto => medium.AddImage( new ImageData(fileName, imgFileNamesDto.ThumbFilename, imgFileNamesDto.MediumFilename, imgFileNamesDto.FullFilename))); } } user.AddPost(post, interest.Interest); }
public void PostImage(User user, FileStreamDto interestImage, int userInterestId, string description) { UserInterest interest = user.Interests.First(x => x.Id == userInterestId); SaveImageForUser( interestImage, user.Username + "-Interest-Image-" + interest.Interest.Name, imgFileNamesDto => user.AddPost( new Post { Description = description, CreateDate = DateTime.UtcNow, Medium = new Image { ImageData = new ImageData( interestImage.FileName , imgFileNamesDto.ThumbFilename , imgFileNamesDto.MediumFilename , imgFileNamesDto.FullFilename), CreateDate = DateTime.UtcNow } }, interest.Interest)); }