Sitecore: Proxying MediaItem

Sitecore

За един от проектите наскоро имахме интересен казус – част от upload-натите файлове в Media Library-то на Sitecore трябваше да са достъпни за сваляне само от регистрирани потребители. Неприятното беше, че всъщност съдържанието на всеки от Item-ите в Media Library вече е достъпно чрез proxy, и едно от решенията беше писане на разширение за pipeline обектите. Другото решение беше написване на собствено proxy, което със сигурност ми харесва повече.

Подчертавам дебело, че това е първият ми ASP.NET модул изобщо, така че бъдете снизходителни. Решението (с махнати подробностите по проверка на достъпа) изглежда така:

Response.Clear();
Sitecore.Data.Database database =
Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.MediaItem MediaFile = 
database.GetItem(ItemID);
 
Stream fileStream = MediaFile.GetMediaStream();
 
Response.ContentType = MediaFile.MimeType;
Response.AppendHeader("Content-Length", 
fileStream.Length.ToString());
Response.AppendHeader("Content-Disposition", 
"attachment; filename="+MediaFile.Name+"."+MediaFile.Extension);
 
byte[] fileContent = BufferStream(fileStream,0);
Response.BinaryWrite(fileContent);

BufferSream е собствен метод, който load-ва съдържанието на MediaStream-а преди да го представи на потребителя. Ето и какво представлява, всъщност:

public static byte[] BufferStream(Stream stream,int initialLength)
{
  if (initialLength < 1) { initialLength = 32768; }
  byte[] buffer = new byte[initialLength];
  int read=0;
  int chunk;
  while ((chunk = stream.Read(buffer,read,buffer.Length-read))>0)
  {
    read += chunk;
    if (read == buffer.Length)
    {
      int nextByte = stream.ReadByte();
      if (nextByte==-1) { return buffer; }
      byte[] newBuffer = new byte[buffer.Length*2];
      Array.Copy(buffer, newBuffer, buffer.Length);
      newBuffer[read]=(byte)nextByte;
      buffer = newBuffer;
      read++;
    }
  }
  byte[] ret = new byte[read];
  Array.Copy(buffer, ret, read);
  return ret;
}

Маркери: ,

За тази статия



Категории

Подобни статии