Управление BLOB

О BLOB

BLOB (Binary Large Object) обычно представляет собой большой объект (фото, презентация, документ или медиафайл), сохраненный в двоичных форматах.

Aspose.Slides для PHP через Java позволяет использовать BLOB для объектов так, чтобы уменьшить потребление памяти при обработке больших файлов.

Используйте BLOB для снижения потребления памяти

Добавление большого файла через BLOB в презентацию

Aspose.Slides для Java позволяет добавлять большие файлы (в этом случае большой видеофайл) через процесс, связанный с BLOB, для снижения потребления памяти.

Этот пример на Java показывает, как добавить большой видеофайл через процесс BLOB в презентацию:

  $pathToVeryLargeVideo = "veryLargeVideo.avi";
  # Создает новую презентацию, в которую будет добавлено видео
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToVeryLargeVideo);
    try {
      # Давайте добавим видео в презентацию - мы выбрали поведение KeepLocked, потому что мы не собираемся
      # получать доступ к файлу "veryLargeVideo.avi".
      $video = $pres->getVideos()->addVideo($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addVideoFrame(0, 0, 480, 270, $video);
      # Сохраняет презентацию. Хотя большая презентация выводится, потребление памяти
      # остается низким на протяжении всего жизненного цикла объекта pres
      $pres->save("presentationWithLargeVideo.pptx", SaveFormat::Pptx);
    } finally {
      if (!java_is_null($fileStream)) {
        $fileStream->close();
      }
    }
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Экспорт большого файла через BLOB из презентации

Aspose.Slides для PHP через Java позволяет экспортировать большие файлы (в этом случае аудио или видеофайл) через процесс, связанный с BLOB, из презентаций. Например, вам может понадобиться извлечь большой медиафайл из презентации, но вы не хотите, чтобы файл загружался в память вашего компьютера. Экспортируя файл через процесс BLOB, вы сохраняете низкое потребление памяти.

Этот код демонстрирует описанную операцию:

  $hugePresentationWithAudiosAndVideosFile = "LargeVideoFileTest.pptx";
  $loadOptions = new LoadOptions();
  # Блокирует исходный файл и НЕ загружает его в память
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  # создаем экземпляр Презентации, блокируем файл "hugePresentationWithAudiosAndVideos.pptx".
  $pres = new Presentation($hugePresentationWithAudiosAndVideosFile, $loadOptions);
  try {
    # Давайте сохраним каждое видео в файл. Чтобы предотвратить высокое использование памяти, нам нужен буфер, который будет использоваться
    # для передачи данных из видеопотока презентации в поток для вновь созданного видеофайла.
    $Array = new JavaClass("java.lang.reflect.Array");
    $Byte = new JavaClass("java.lang.Byte");
    $buffer = $Array->newInstance($Byte, 8 * 1024);
    # Итерируемся по видео
    for($index = 0; $index < java_values($pres->getVideos()->size()) ; $index++) {
      $video = $pres->getVideos()->get_Item($index);
      # Открывает видеопоток презентации. Обратите внимание, что мы намеренно избегали доступа к свойствам
      # как video.BinaryData - потому что это свойство возвращает массив байтов, содержащий полное видео, что затем
      # вызывает загрузку байтов в память. Мы используем video.GetStream, который вернет Stream - и это НЕ
      # требует от нас загрузки всего видео в память.
      $presVideoStream = $video->getStream();
      try {
        $outputFileStream = new Java("java.io.FileOutputStream", "video" . $index . ".avi");
        try {
          $bytesRead;
          while ($bytesRead = $presVideoStream->read($buffer, 0, java_values($Array->getLength($buffer))) > 0) {
            $outputFileStream->write($buffer, 0, $bytesRead);
          } 
        } finally {
          $outputFileStream->close();
        }
      } finally {
        $presVideoStream->close();
      }
      # Потребление памяти останется низким независимо от размера видео или презентации.
    }
    # Если необходимо, вы можете применить те же шаги для аудиофайлов.
  } catch (JavaException $e) {
  } finally {
    $pres->dispose();
  }

Добавление изображения как BLOB в презентацию

С помощью методов интерфейса IImageCollection и класса ImageCollection вы можете добавить большое изображение как поток, чтобы оно считалось BLOB.

Этот код на PHP показывает, как добавить большое изображение через процесс BLOB:

  $pathToLargeImage = "large_image.jpg";
  # создает новую презентацию, в которую будет добавлено изображение.
  $pres = new Presentation();
  try {
    $fileStream = new Java("java.io.FileInputStream", $pathToLargeImage);
    try {
      # Давайте добавим изображение в презентацию - мы выбираем поведение KeepLocked, потому что мы не собираемся
      # получать доступ к файлу "largeImage.png".
      $img = $pres->getImages()->addImage($fileStream, LoadingStreamBehavior->KeepLocked);
      $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, 300, 200, $img);
      # Сохраняет презентацию. Хотя большая презентация выводится, потребление памяти
      # остается низким на протяжении всего жизненного цикла объекта pres
      $pres->save("presentationWithLargeImage.pptx", SaveFormat::Pptx);
    } finally {
      if (!java_is_null($fileStream)) {
        $fileStream->close();
      }
    }
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Память и большие презентации

Обычно для загрузки большой презентации компьютерам требуется много временной памяти. Все содержимое презентации загружается в память, и файл (из которого была загружена презентация) перестает использоваться.

Рассмотрим большую презентацию PowerPoint (large.pptx), которая содержит видеофайл объемом 1,5 ГБ. Обычный метод загрузки презентации описан в этом коде на PHP:

  $pres = new Presentation("large.pptx");
  try {
    $pres->save("large.pdf", SaveFormat::Pdf);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Но этот метод потребляет около 1,6 ГБ временной памяти.

Загрузка большой презентации как BLOB

С помощью процесса, связанного с BLOB, вы можете загрузить большую презентацию, используя при этом мало памяти. Этот код на PHP описывает реализацию, где используется процесс BLOB для загрузки большого файла презентации (large.pptx):

  $loadOptions = new LoadOptions();
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  $loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
  $pres = new Presentation("large.pptx", $loadOptions);
  try {
    $pres->save("large.pdf", SaveFormat::Pdf);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Изменение папки для временных файлов

Когда используется процесс BLOB, ваш компьютер создает временные файлы в стандартной папке для временных файлов. Если вы хотите, чтобы временные файлы хранились в другой папке, вы можете изменить настройки хранения, используя TempFilesRootPath:

  $loadOptions = new LoadOptions();
  $loadOptions->getBlobManagementOptions()->setPresentationLockingBehavior(PresentationLockingBehavior->KeepLocked);
  $loadOptions->getBlobManagementOptions()->setTemporaryFilesAllowed(true);
  $loadOptions->getBlobManagementOptions()->setTempFilesRootPath("temp");