/// <summary> /// Gets the loaded picture binary depending on picture storage settings /// </summary> /// <param name="picture">Picture</param> /// <param name="fromDb">Load from database; otherwise, from file system</param> /// <returns>Picture binary</returns> protected virtual byte[] LoadPictureBinary(Picture picture, bool fromDb) { if (picture == null) throw new ArgumentNullException("picture"); var result = fromDb ? picture.PictureBinary : LoadPictureFromFile(picture.Id, picture.MimeType); return result; }
/// <summary> /// Delete a picture on file system /// </summary> /// <param name="picture">Picture</param> protected virtual void DeletePictureOnFileSystem(Picture picture) { if (picture == null) throw new ArgumentNullException("picture"); string lastPart = GetFileExtensionFromMimeType(picture.MimeType); string fileName = string.Format("{0}_0.{1}", picture.Id.ToString("0000000"), lastPart); string filePath = GetPictureLocalPath(fileName); if (File.Exists(filePath)) { File.Delete(filePath); } }
/// <summary> /// Delete picture thumbs /// </summary> /// <param name="picture">Picture</param> protected virtual void DeletePictureThumbs(Picture picture) { string filter = string.Format("{0}*.*", picture.Id.ToString("0000000")); var thumbDirectoryPath = _webHelper.MapPath("~/content/images/thumbs"); string[] currentFiles = System.IO.Directory.GetFiles(thumbDirectoryPath, filter, SearchOption.AllDirectories); foreach (string currentFileName in currentFiles) { var thumbFilePath = GetThumbLocalPath(currentFileName); File.Delete(thumbFilePath); } }
/// <summary> /// Gets the loaded picture binary depending on picture storage settings /// </summary> /// <param name="picture">Picture</param> /// <returns>Picture binary</returns> public virtual byte[] LoadPictureBinary(Picture picture) { return LoadPictureBinary(picture, this.StoreInDb); }
/// <summary> /// Inserts a picture /// </summary> /// <param name="pictureBinary">The picture binary</param> /// <param name="mimeType">The picture MIME type</param> /// <param name="seoFilename">The SEO filename</param> /// <param name="altAttribute">"alt" attribute for "img" HTML element</param> /// <param name="titleAttribute">"title" attribute for "img" HTML element</param> /// <param name="isNew">A value indicating whether the picture is new</param> /// <param name="validateBinary">A value indicating whether to validated provided picture binary</param> /// <returns>Picture</returns> public virtual Picture InsertPicture(byte[] pictureBinary, string mimeType, string seoFilename, string altAttribute = null, string titleAttribute = null, bool isNew = true, bool validateBinary = true) { mimeType = CommonHelper.EnsureNotNull(mimeType); mimeType = CommonHelper.EnsureMaximumLength(mimeType, 20); seoFilename = CommonHelper.EnsureMaximumLength(seoFilename, 100); if (validateBinary) pictureBinary = ValidatePicture(pictureBinary, mimeType); var picture = new Picture { PictureBinary = this.StoreInDb ? pictureBinary : new byte[0], MimeType = mimeType, SeoFilename = seoFilename, AltAttribute = altAttribute, TitleAttribute = titleAttribute, IsNew = isNew, }; _pictureRepository.Insert(picture); if(!this.StoreInDb) SavePictureInFile(picture.Id, pictureBinary, mimeType); //event notification _eventPublisher.EntityInserted(picture); return picture; }
/// <summary> /// Get a picture local path /// </summary> /// <param name="picture">Picture instance</param> /// <param name="targetSize">The target picture size (longest side)</param> /// <param name="showDefaultPicture">A value indicating whether the default picture is shown</param> /// <returns></returns> public virtual string GetThumbLocalPath(Picture picture, int targetSize = 0, bool showDefaultPicture = true) { string url = GetPictureUrl(picture, targetSize, showDefaultPicture); if(String.IsNullOrEmpty(url)) return String.Empty; return GetThumbLocalPath(Path.GetFileName(url)); }
/// <summary> /// Get a picture URL /// </summary> /// <param name="picture">Picture instance</param> /// <param name="targetSize">The target picture size (longest side)</param> /// <param name="showDefaultPicture">A value indicating whether the default picture is shown</param> /// <param name="storeLocation">Store location URL; null to use determine the current store location automatically</param> /// <param name="defaultPictureType">Default picture type</param> /// <returns>Picture URL</returns> public virtual string GetPictureUrl(Picture picture, int targetSize = 0, bool showDefaultPicture = true, string storeLocation = null, PictureType defaultPictureType = PictureType.Entity) { string url = string.Empty; byte[] pictureBinary = null; if (picture != null) pictureBinary = LoadPictureBinary(picture); if (picture == null || pictureBinary == null || pictureBinary.Length == 0) { if(showDefaultPicture) { url = GetDefaultPictureUrl(targetSize, defaultPictureType, storeLocation); } return url; } string lastPart = GetFileExtensionFromMimeType(picture.MimeType); string thumbFileName; if (picture.IsNew) { DeletePictureThumbs(picture); //we do not validate picture binary here to ensure that no exception ("Parameter is not valid") will be thrown picture = UpdatePicture(picture.Id, pictureBinary, picture.MimeType, picture.SeoFilename, picture.AltAttribute, picture.TitleAttribute, false, false); } lock (s_lock) { string seoFileName = picture.SeoFilename; // = GetPictureSeName(picture.SeoFilename); //just for sure if (targetSize == 0) { thumbFileName = !String.IsNullOrEmpty(seoFileName) ? string.Format("{0}_{1}.{2}", picture.Id.ToString("0000000"), seoFileName, lastPart) : string.Format("{0}.{1}", picture.Id.ToString("0000000"), lastPart); var thumbFilePath = GetThumbLocalPath(thumbFileName); if (!File.Exists(thumbFilePath)) { File.WriteAllBytes(thumbFilePath, pictureBinary); } } else { thumbFileName = !String.IsNullOrEmpty(seoFileName) ? string.Format("{0}_{1}_{2}.{3}", picture.Id.ToString("0000000"), seoFileName, targetSize, lastPart) : string.Format("{0}_{1}.{2}", picture.Id.ToString("0000000"), targetSize, lastPart); var thumbFilePath = GetThumbLocalPath(thumbFileName); if (!File.Exists(thumbFilePath)) { using (var stream = new MemoryStream(pictureBinary)) { Bitmap b = null; try { //try-catch to ensure that picture binary is really OK. Otherwise, we can get "Parameter is not valid" exception if binary is corrupted for some reasons b = new Bitmap(stream); } catch (ArgumentException exc) { _logger.Error(string.Format("Error generating picture thumb. ID={0}", picture.Id), exc); } if (b == null) { //bitmap could not be loaded for some reasons return url; } using (var destStream = new MemoryStream()) { var newSize = CalculateDimensions(b.Size, targetSize); ImageBuilder.Current.Build(b, destStream, new ResizeSettings { Width = newSize.Width, Height = newSize.Height, Scale = ScaleMode.Both, Quality = _mediaSettings.DefaultImageQuality }); var destBinary = destStream.ToArray(); File.WriteAllBytes(thumbFilePath, destBinary); b.Dispose(); } } } } } url = GetThumbUrl(thumbFileName, storeLocation); return url; }
/// <summary> /// Deletes a picture /// </summary> /// <param name="picture">Picture</param> public virtual void DeletePicture(Picture picture) { if (picture == null) throw new ArgumentNullException("picture"); //delete thumbs DeletePictureThumbs(picture); //delete from file system if (!this.StoreInDb) DeletePictureOnFileSystem(picture); //delete from database _pictureRepository.Delete(picture); //event notification _eventPublisher.EntityDeleted(picture); }