Advertisement
Guest User

Untitled

a guest
Jan 7th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.66 KB | None | 0 0
  1. using Sitecore.Common;
  2. using Sitecore.Configuration;
  3. using Sitecore.Data;
  4. using Sitecore.Data.Fields;
  5. using Sitecore.Data.Items;
  6. using Sitecore.Diagnostics;
  7. using Sitecore.IO;
  8. using Sitecore.SecurityModel;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Web;
  14.  
  15. namespace Sitecore.Resources.Media
  16. {
  17. public class MediaData : IPrototype<MediaData>
  18. {
  19. private string _dataFieldName = "blob";
  20. private MediaItem _mediaItem;
  21. private DateTime? updated;
  22.  
  23. public MediaData()
  24. {
  25. }
  26.  
  27. public MediaData(MediaItem mediaItem)
  28. {
  29. Assert.ArgumentNotNull((object) mediaItem, nameof (mediaItem));
  30. this.Initialize(mediaItem);
  31. }
  32.  
  33. public virtual string DataFieldName
  34. {
  35. get
  36. {
  37. return this._dataFieldName;
  38. }
  39. set
  40. {
  41. Assert.ArgumentNotNullOrEmpty(value, nameof (value));
  42. this._dataFieldName = value;
  43. }
  44. }
  45.  
  46. public virtual string Extension
  47. {
  48. get
  49. {
  50. return this.MediaItem.Extension;
  51. }
  52. }
  53.  
  54. public virtual bool HasContent
  55. {
  56. get
  57. {
  58. if (this.HasFileContent)
  59. return true;
  60. Field field = this.MediaItem.InnerItem.Fields[this.DataFieldName];
  61. return field != null && field.HasBlobStream;
  62. }
  63. }
  64.  
  65. public virtual bool HasFileContent
  66. {
  67. get
  68. {
  69. if (this.IsValidFilePath(this.MediaItem.FilePath))
  70. return FileUtil.FileExists(this.MediaItem.FilePath);
  71. return false;
  72. }
  73. }
  74.  
  75. public virtual string MediaId
  76. {
  77. get
  78. {
  79. ID id = (ID) null;
  80. if (!string.IsNullOrEmpty(this.MediaItem.FilePath))
  81. {
  82. string lowerInvariant = this.MediaItem.FilePath.ToLowerInvariant();
  83. id = !Settings.Media.CacheFileMediaByModifiedDate ? MainUtil.GetMD5Hash(lowerInvariant) : MainUtil.GetMD5Hash(lowerInvariant + (object) File.GetLastWriteTimeUtc(FileUtil.MapPath(lowerInvariant)));
  84. }
  85. else
  86. {
  87. Field field = this._mediaItem.InnerItem.Fields[this.DataFieldName];
  88. if (field != null && MainUtil.IsID(field.Value))
  89. id = ID.Parse(field.Value);
  90. }
  91. if (!(id == (ID) null))
  92. return id.ToShortID().ToString().ToLowerInvariant();
  93. return string.Empty;
  94. }
  95. }
  96.  
  97. public virtual MediaItem MediaItem
  98. {
  99. get
  100. {
  101. return this._mediaItem;
  102. }
  103. }
  104.  
  105. public virtual string MimeType
  106. {
  107. get
  108. {
  109. return MediaManager.MimeResolver.GetMimeType(this.MediaItem);
  110. }
  111. }
  112.  
  113. public DateTime Updated
  114. {
  115. get
  116. {
  117. if (!this.updated.HasValue)
  118. {
  119. Item innerItem = this.MediaItem.InnerItem;
  120. if (innerItem.Versions.Count > 0)
  121. {
  122. this.updated = new DateTime?(innerItem.Statistics.Updated);
  123. }
  124. else
  125. {
  126. Item[] versions = innerItem.Versions.GetVersions(true);
  127. this.updated = versions.Length <= 0 ? new DateTime?(DateTimeOffset.MinValue.UtcDateTime) : new DateTime?(((IEnumerable<Item>) versions).Select<Item, DateTime>((Func<Item, DateTime>) (item => item.Statistics.Updated)).Max<DateTime>());
  128. }
  129. }
  130. return this.updated.Value;
  131. }
  132. }
  133.  
  134. public virtual MediaStream GetStream()
  135. {
  136. if (this.MediaItem.FileBased)
  137. return this.GetFileStream();
  138. return this.GetBlobStream();
  139. }
  140.  
  141. public virtual MediaStream GetThumbnailStream()
  142. {
  143. return this.GetThumbnailStream(new TransformationOptions());
  144. }
  145.  
  146. public virtual MediaStream GetThumbnailStream(TransformationOptions options)
  147. {
  148. Assert.ArgumentNotNull((object) options, nameof (options));
  149. ThumbnailGenerator thumbnailGenerator = MediaManager.Config.GetThumbnailGenerator(this.Extension);
  150. if (thumbnailGenerator == null)
  151. return (MediaStream) null;
  152. MediaStream stream = thumbnailGenerator.GetStream(this, options);
  153. if (stream != null)
  154. return stream;
  155. return MediaManager.Config.GetThumbnailGenerator("*")?.GetStream(this, options);
  156. }
  157.  
  158. public virtual void Initialize(MediaItem mediaItem)
  159. {
  160. Assert.ArgumentNotNull((object) mediaItem, nameof (mediaItem));
  161. this._mediaItem = mediaItem;
  162. }
  163.  
  164. public virtual void ReleaseStream()
  165. {
  166. Item innerItem = this._mediaItem.InnerItem;
  167. Field field = innerItem.Fields[this.DataFieldName];
  168. if (field == null || field.Value.IsNullOrEmpty())
  169. return;
  170. using (new EditContext(innerItem))
  171. innerItem.Fields[this.DataFieldName].Value = string.Empty;
  172. }
  173.  
  174. public virtual void SetStream(MediaStream mediaStream)
  175. {
  176. Assert.ArgumentNotNull((object) mediaStream, nameof (mediaStream));
  177. if (mediaStream.MediaItem.FileBased)
  178. this.SetFileStream(mediaStream);
  179. else
  180. this.SetBlobStream(mediaStream);
  181. }
  182.  
  183. public virtual MediaData Clone()
  184. {
  185. Assert.IsTrue(this.GetType() == typeof (MediaData), "The Clone() method must be overriden to support prototyping.");
  186. return new MediaData()
  187. {
  188. _mediaItem = this._mediaItem,
  189. _dataFieldName = this._dataFieldName
  190. };
  191. }
  192.  
  193. protected virtual MediaStream GetBlobStream()
  194. {
  195. Field field = this.MediaItem.InnerItem.Fields[this.DataFieldName];
  196. if (field == null)
  197. return (MediaStream) null;
  198. Stream blobStream = field.GetBlobStream();
  199. if (blobStream == null)
  200. return (MediaStream) null;
  201. try
  202. {
  203. return new MediaStream(blobStream, this.Extension, this.MediaItem);
  204. }
  205. catch
  206. {
  207. return (MediaStream) null;
  208. }
  209. }
  210.  
  211. protected virtual MediaStream GetFileStream()
  212. {
  213. string filePath = this.MediaItem.FilePath;
  214. if (string.IsNullOrEmpty(filePath) || filePath.Contains("~"))
  215. return (MediaStream) null;
  216. if (!this.IsValidFilePath(filePath))
  217. return (MediaStream) null;
  218. if (!this.IsValidFilePath(filePath))
  219. return (MediaStream) null;
  220. string str = FileUtil.MapPath(filePath);
  221. if (!FileUtil.FileExists(str))
  222. return (MediaStream) null;
  223. return new MediaStream((Stream) File.Open(str, FileMode.Open, FileAccess.Read, FileShare.Read), this.Extension, this.MediaItem);
  224. }
  225.  
  226. protected virtual bool IsValidFilePath(string filePath)
  227. {
  228. try
  229. {
  230. return !string.IsNullOrEmpty(filePath) && MainUtil.MapPath(filePath).StartsWith(MainUtil.MapPath(Settings.Media.FileFolder), StringComparison.InvariantCultureIgnoreCase);
  231. }
  232. catch (HttpException ex)
  233. {
  234. return false;
  235. }
  236. catch (NotSupportedException ex)
  237. {
  238. return false;
  239. }
  240. }
  241.  
  242. protected virtual void SetBlobStream(MediaStream mediaStream)
  243. {
  244. Assert.ArgumentNotNull((object) mediaStream, nameof (mediaStream));
  245. Assert.IsTrue((mediaStream.AllowDatabaseStorage ? 1 : 0) != 0, "Media larger than {0} bytes can not be stored in database blob fields. Use file storage instead.", (object) Settings.Media.MaxSizeInDatabase);
  246. Item innerItem = this.MediaItem.InnerItem;
  247. Field field = innerItem.Fields[this.DataFieldName];
  248. if (field == null)
  249. return;
  250. using (new EditContext(innerItem))
  251. field.SetBlobStream(mediaStream.Stream);
  252. }
  253.  
  254. protected virtual void SetFileStream(MediaStream mediaStream)
  255. {
  256. Assert.ArgumentNotNull((object) mediaStream, nameof (mediaStream));
  257. MediaItem mediaItem = mediaStream.MediaItem;
  258. Assert.IsNotNull((object) mediaItem, "No media item in media stream.");
  259. string str = mediaItem.FilePath;
  260. if (string.IsNullOrEmpty(str))
  261. {
  262. str = MediaPathManager.GetMediaFilePath(mediaItem.InnerItem.Paths.Path, mediaStream.Extension);
  263. using (new SecurityDisabler())
  264. {
  265. using (new EditContext(mediaItem.InnerItem))
  266. mediaItem.FilePath = str;
  267. }
  268. }
  269. Assert.IsNotNullOrEmpty(str, "Empty file path in file based media item.");
  270. Assert.IsFalse(str.Contains("~"), "A file based media destination path may not contain a '~' character.");
  271. FileUtil.EnsureFileFolder(str);
  272. using (FileStream fileStream = File.Open(FileUtil.MapPath(str), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
  273. {
  274. Stream stream = mediaStream.Stream;
  275. if (stream.CanSeek)
  276. stream.Seek(0L, SeekOrigin.Begin);
  277. FileUtil.CopyStream(stream, (Stream) fileStream, Settings.Media.StreamBufferSize);
  278. }
  279. }
  280. }
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement