]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/File.php
Select the first generated thumbnail, which should be the proper size
[quix0rs-gnu-social.git] / classes / File.php
index 0368153acda7a2acba235ef567774d69199061aa..7bd7da27ba5b96b7a8fcefbc0d9b12f54c444b85 100644 (file)
@@ -120,7 +120,7 @@ class File extends Managed_DataObject
                         // $args['attachment'] should always be set if action===attachment, given our routing rules
                         $file = File::getByID($args['attachment']);
                         return $file;
-                    } catch (EmptyIdException $e) {
+                    } catch (EmptyPkeyValueException $e) {
                         // ...but $args['attachment'] can also be 0...
                     } catch (NoResultException $e) {
                         // apparently this link goes to us, but is _not_ an existing attachment (File) ID?
@@ -260,11 +260,12 @@ class File extends Managed_DataObject
 
     public function getFilename()
     {
-        if (!self::validFilename($this->filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
-        return $this->filename;
+        return self::tryFilename($this->filename);
+    }
+
+    public function getSize()
+    {
+        return intval($this->size);
     }
 
     // where should the file go?
@@ -303,13 +304,12 @@ class File extends Managed_DataObject
             $ext = common_supported_mime_to_ext($mimetype);
             // we do, so use it!
             return $ext;
-        } catch (Exception $e) {    // FIXME: Make this exception more specific to "unknown mime=>ext relation"
+        } catch (UnknownMimeExtensionException $e) {
             // We don't know the extension for this mimetype, but let's guess.
 
-            // If we are very liberal with uploads ($config['attachments']['supported'] === true)
-            // then we try to do some guessing based on the filename, if it was supplied.
-            if (!is_null($filename) && common_config('attachments', 'supported')===true
-                    && preg_match('/^.+\.([A-Za-z0-9]+)$/', $filename, $matches)) {
+            // If we can't recognize the extension from the MIME, we try
+            // to guess based on filename, if one was supplied.
+            if (!is_null($filename) && preg_match('/^.+\.([A-Za-z0-9]+)$/', $filename, $matches)) {
                 // we matched on a file extension, so let's see if it means something.
                 $ext = mb_strtolower($matches[1]);
 
@@ -329,6 +329,8 @@ class File extends Managed_DataObject
                 // the attachment extension based on its filename was not blacklisted so it's ok to use it
                 return $ext;
             }
+        } catch (Exception $e) {
+            common_log(LOG_INFO, 'Problem when figuring out extension for mimetype: '._ve($e));
         }
 
         // If nothing else has given us a result, try to extract it from
@@ -349,15 +351,23 @@ class File extends Managed_DataObject
         return preg_match('/^[A-Za-z0-9._-]+$/', $filename);
     }
 
+    static function tryFilename($filename)
+    {
+        if (!self::validFilename($filename))
+        {
+            throw new InvalidFilenameException($filename);
+        }
+        // if successful, return the filename for easy if-statementing
+        return $filename;
+    }
+
     /**
      * @throws ClientException on invalid filename
      */
     static function path($filename)
     {
-        if (!self::validFilename($filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
+        self::tryFilename($filename);
+
         $dir = common_config('attachments', 'dir');
 
         if (!in_array($dir[mb_strlen($dir)-1], ['/', '\\'])) {
@@ -369,10 +379,7 @@ class File extends Managed_DataObject
 
     static function url($filename)
     {
-        if (!self::validFilename($filename)) {
-            // TRANS: Client exception thrown if a file upload does not have a valid name.
-            throw new ClientException(_("Invalid filename."));
-        }
+        self::tryFilename($filename);
 
         if (common_config('site','private')) {
 
@@ -477,6 +484,8 @@ class File extends Managed_DataObject
      * @param $width  int   Max width of thumbnail in pixels. (if null, use common_config values)
      * @param $height int   Max height of thumbnail in pixels. (if null, square-crop to $width)
      * @param $crop   bool  Crop to the max-values' aspect ratio
+     * @param $force_still  bool    Don't allow fallback to showing original (such as animated GIF)
+     * @param $upscale      mixed   Whether or not to scale smaller images up to larger thumbnail sizes. (null = site default)
      *
      * @return File_thumbnail
      *
@@ -497,7 +506,7 @@ class File extends Managed_DataObject
                     return File_thumbnail::byFile($this);
                 } catch (NoResultException $e) {
                     // and if it's not a remote file, it'll be safe to use the locally stored File
-                    throw new UseFileAsThumbnailException($this->id);
+                    throw new UseFileAsThumbnailException($this);
                 }
             }
         }
@@ -515,13 +524,28 @@ class File extends Managed_DataObject
         return $filepath;
     }
 
-    public function getUrl($prefer_local=true)
+    public function getAttachmentUrl()
+    {
+        return common_local_url('attachment', array('attachment'=>$this->getID()));
+    }
+
+    /**
+     *  @param  mixed   $use_local  true means require local, null means prefer local, false means use whatever is stored
+     */
+    public function getUrl($use_local=null)
     {
-        if ($prefer_local && !empty($this->filename)) {
-            // A locally stored file, so let's generate a URL for our instance.
-            return self::url($this->getFilename());
+        if ($use_local !== false) {
+            if (is_string($this->filename) || !empty($this->filename)) {
+                // A locally stored file, so let's generate a URL for our instance.
+                return self::url($this->getFilename());
+            }
+            if ($use_local) {
+                // if the file wasn't stored locally (has filename) and we require a local URL
+                throw new FileNotStoredLocallyException($this);
+            }
         }
 
+
         // No local filename available, return the URL we have stored
         return $this->url;
     }