]> source.dussan.org Git - nextcloud-server.git/commitdiff
Better detection of mimetypes while uploading a zip on a mac
authorJoas Schilling <coding@schilljs.com>
Fri, 2 Sep 2016 11:37:23 +0000 (13:37 +0200)
committerJoas Schilling <coding@schilljs.com>
Thu, 8 Sep 2016 07:21:00 +0000 (09:21 +0200)
apps/workflowengine/lib/Check/FileMimeType.php

index 1de9a70a17d54db371aa5b1e5dd4758a75f8673b..43c856a7c980f89dfadbacd542a9b291f1ad5fd3 100644 (file)
@@ -23,12 +23,13 @@ namespace OCA\WorkflowEngine\Check;
 
 
 use OCP\Files\IMimeTypeDetector;
+use OCP\Files\Storage\IStorage;
 use OCP\IL10N;
 use OCP\IRequest;
 
 class FileMimeType extends AbstractStringCheck {
 
-       /** @var string */
+       /** @var array */
        protected $mimeType;
 
        /** @var IRequest */
@@ -37,6 +38,12 @@ class FileMimeType extends AbstractStringCheck {
        /** @var IMimeTypeDetector */
        protected $mimeTypeDetector;
 
+       /** @var IStorage */
+       protected $storage;
+
+       /** @var string */
+       protected $path;
+
        /**
         * @param IL10N $l
         * @param IRequest $request
@@ -48,27 +55,58 @@ class FileMimeType extends AbstractStringCheck {
                $this->mimeTypeDetector = $mimeTypeDetector;
        }
 
+       /**
+        * @param IStorage $storage
+        * @param string $path
+        */
+       public function setFileInfo(IStorage $storage, $path) {
+               $this->storage = $storage;
+               $this->path = $path;
+               if (!isset($this->mimeType[$this->storage->getId()][$this->path])
+                       || $this->mimeType[$this->storage->getId()][$this->path] === '') {
+                       $this->mimeType[$this->storage->getId()][$this->path] = null;
+               }
+       }
+
        /**
         * @return string
         */
        protected function getActualValue() {
-               if ($this->mimeType !== null) {
-                       return $this->mimeType;
+               if ($this->mimeType[$this->storage->getId()][$this->path] !== null) {
+                       return $this->mimeType[$this->storage->getId()][$this->path];
                }
 
-               $this->mimeType = '';
+               $this->mimeType[$this->storage->getId()][$this->path] = '';
                if ($this->isWebDAVRequest()) {
                        if ($this->request->getMethod() === 'PUT') {
                                $path = $this->request->getPathInfo();
-                               $this->mimeType = $this->mimeTypeDetector->detectPath($path);
+                               $this->mimeType[$this->storage->getId()][$this->path] = $this->mimeTypeDetector->detectPath($path);
+                               return $this->mimeType[$this->storage->getId()][$this->path];
                        }
-               } else if (in_array($this->request->getMethod(), ['POST', 'PUT'])) {
+               }
+
+               if (in_array($this->request->getMethod(), ['POST', 'PUT'])) {
                        $files = $this->request->getUploadedFile('files');
                        if (isset($files['type'][0])) {
-                               $this->mimeType = $files['type'][0];
+                               $mimeType = $files['type'][0];
+                               if ($this->mimeType === 'application/octet-stream') {
+                                       // Maybe not...
+                                       $mimeTypeTest = $this->mimeTypeDetector->detectPath($files['name'][0]);
+                                       if ($mimeTypeTest !== 'application/octet-stream' && $mimeTypeTest !== false) {
+                                               $mimeType = $mimeTypeTest;
+                                       } else {
+                                               $mimeTypeTest = $this->mimeTypeDetector->detect($files['tmp_name'][0]);
+                                               if ($mimeTypeTest !== 'application/octet-stream' && $mimeTypeTest !== false) {
+                                                       $mimeType = $mimeTypeTest;
+                                               }
+                                       }
+                               }
+                               $this->mimeType[$this->storage->getId()][$this->path] = $mimeType;
+                               return $mimeType;
                        }
                }
-               return $this->mimeType;
+
+               return $this->mimeType[$this->storage->getId()][$this->path];
        }
 
        /**