summaryrefslogtreecommitdiff
path: root/src/Manager
diff options
context:
space:
mode:
Diffstat (limited to 'src/Manager')
-rw-r--r--src/Manager/ScormDisk.php74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/Manager/ScormDisk.php b/src/Manager/ScormDisk.php
new file mode 100644
index 0000000..9a03f59
--- /dev/null
+++ b/src/Manager/ScormDisk.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Peopleaps\Scorm\Manager;
+
+use Illuminate\Filesystem\FilesystemAdapter;
+use Illuminate\Support\Facades\Storage;
+use Peopleaps\Scorm\Exception\StorageNotFoundException;
+use ZipArchive;
+
+class ScormDisk
+{
+ /**
+ * Extract zip file into destination directory.
+ *
+ * @param string $path Destination directory
+ * @param string $zipFilePath The path to the zip file.
+ *
+ * @return bool True on success, false on failure.
+ */
+ public function unzip($file, $path)
+ {
+ $path = $this->cleanPath($path);
+
+ $zipArchive = new ZipArchive();
+ if ($zipArchive->open($file) !== true) {
+ return false;
+ }
+
+ /** @var FilesystemAdapter $disk */
+ $disk = $this->getDisk();
+
+ for ($i = 0; $i < $zipArchive->numFiles; ++$i) {
+ $zipEntryName = $zipArchive->getNameIndex($i);
+ $destination = $path . DIRECTORY_SEPARATOR . $this->cleanPath($zipEntryName);
+ if ($this->isDirectory($zipEntryName)) {
+ $disk->createDir($destination);
+ continue;
+ }
+ $disk->putStream($destination, $zipArchive->getStream($zipEntryName));
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $directory
+ * @return bool
+ */
+ public function deleteScormFolder($folderHashedName)
+ {
+ return $this->getDisk()->deleteDirectory($folderHashedName);
+ }
+
+ private function isDirectory($zipEntryName)
+ {
+ return substr($zipEntryName, -1) === '/';
+ }
+
+ private function cleanPath($path)
+ {
+ return str_replace('/', DIRECTORY_SEPARATOR, $path);
+ }
+
+ /**
+ * @return FilesystemAdapter $disk
+ */
+ private function getDisk()
+ {
+ if (!config()->has('filesystems.disks.' . config('scorm.disk'))) {
+ throw new StorageNotFoundException();
+ }
+ return Storage::disk(config('scorm.disk'));
+ }
+}