r2357 - implement previews for files
authorDenis Ovsienko <infrastation@yandex.ru>
Thu, 22 Jan 2009 11:09:31 +0000 (11:09 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 22 Jan 2009 11:09:31 +0000 (11:09 +0000)
inc/interface.php
inc/ophandlers.php
install/init-dictbase.sql
render_image.php
upgrade.php

index 2c056a7..352af54 100644 (file)
@@ -5688,7 +5688,7 @@ function renderFilesPortlet ($entity_type = NULL, $entity_id = 0)
        $files = getFilesOfEntity ($entity_type, $entity_id);
        if (count ($files))
        {
-               startPortlet ('files');
+               startPortlet ('files (' . count ($files) . ')');
                echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
                echo "<tr><th>Name</th><th>Size</th><th>Comment</th><th>Actions</th></tr>\n";
                foreach ($files as $file_id => $file)
@@ -5699,6 +5699,43 @@ function renderFilesPortlet ($entity_type = NULL, $entity_id = 0)
                        echo "<td><a href='${root}download.php?file_id=${file_id}'>";
                        printImageHREF ('download', 'Download file');
                        echo '</a></td></tr>';
+                       switch ($file['type'])
+                       {
+                               // "These types will be automatically detected if your build of PHP supports them: JPEG, PNG, GIF, WBMP, and GD2."
+                               case 'image/jpeg':
+                               case 'image/png':
+                               case 'image/gif':
+                               case 'image/vnd.wap.wbmp':
+                                       $file = getFile ($file_id);
+                                       $image = imagecreatefromstring ($file['contents']);
+                                       $width = imagesx ($image);
+                                       $height = imagesy ($image);
+                                       if ($width < getConfigVar ('PREVIEW_IMAGE_MAXPXS') and $height < getConfigVar ('PREVIEW_IMAGE_MAXPXS'))
+                                               $resampled = FALSE;
+                                       else
+                                       {
+                                               $ratio = getConfigVar ('PREVIEW_IMAGE_MAXPXS') / max ($width, $height);
+                                               $width = $width * $ratio;
+                                               $height = $height * $ratio;
+                                               $resampled = TRUE;
+                                       }
+                                       echo '<tr><td colspan=4>' . ($resampled ? "<a href='${root}render_image.php?img=view&file_id=${file_id}'>" : '');
+                                       echo "<img width=${width} height=${height} src='${root}render_image.php?img=preview&file_id=${file_id}'>";
+                                       echo ($resampled ? '</a>' : '') . '</td></tr>';
+                                       break;
+                               case 'text/plain':
+                                       if ($file['size'] < getConfigVar ('PREVIEW_TEXT_MAXCHARS'))
+                                       {
+                                               $file = getFile($file_id);
+                                               echo '<tr><td colspan=4><textarea rows=' . getConfigVar ('PREVIEW_TEXT_ROWS');
+                                               echo ' cols=' . getConfigVar ('PREVIEW_TEXT_COLS') . '>';
+                                               echo $file['contents'];
+                                               echo '</textarea></td></tr>';
+                                       }
+                                       break;
+                               default:
+                                       break;
+                       }
                }
                echo "</table><br>\n";
                finishPortlet();
index 6a48bb6..e9ba7a7 100644 (file)
@@ -824,6 +824,10 @@ function resetUIConfig()
        setConfigVar ('IPV4_JAYWALK', 'no');
        setConfigVar ('ADDNEW_AT_TOP', 'yes');
        setConfigVar ('IPV4_TREE_SHOW_USAGE', 'yes');
+       setConfigVar ('PREVIEW_TEXT_MAXCHARS', '10240');
+       setConfigVar ('PREVIEW_TEXT_ROWS', '25');
+       setConfigVar ('PREVIEW_TEXT_COLS', '80');
+       setConfigVar ('PREVIEW_IMAGE_MAXPXS', '320');
        return buildRedirectURL (__FUNCTION__, 'OK');
 }
 
index fd876ca..975858e 100644 (file)
@@ -274,6 +274,10 @@ INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, descriptio
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_JAYWALK','no','string','no','no','Enable IPv4 address allocations w/o covering network');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('ADDNEW_AT_TOP','yes','string','no','no','Render "add new" line at top of the list');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_TREE_SHOW_USAGE','yes','string','no','no','Show address usage in IPv4 tree');
+INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_MAXCHARS','10240','uint','yes','no','Max chars for text file preview');
+INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_ROWS','25','uint','yes','no','Rows for text file preview');
+INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_COLS','80','uint','yes','no','Columns for text file preview');
+INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_IMAGE_MAXPXS','320','uint','yes','no','Max pixels per axis for image file preview');
 INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('DB_VERSION','0.17.0','string','no','yes','Database version.');
 
 INSERT INTO `Script` VALUES ('RackCode','allow {$userid_1}');
index 31d7ac3..8c63163 100644 (file)
@@ -2,11 +2,11 @@
 
 require 'inc/init.php';
 
-assertStringArg ('img', 'render_image');
+assertStringArg ('img', __FILE__);
 switch ($_REQUEST['img'])
 {
        case 'minirack': // rack security context
-               assertUIntArg ('rack_id', 'render_image');
+               assertUIntArg ('rack_id', __FILE__);
                $pageno = 'rack';
                $tabno = 'default';
                fixContext();
@@ -16,9 +16,20 @@ switch ($_REQUEST['img'])
                        renderRackThumb ($_REQUEST['rack_id']);
                break;
        case 'progressbar': // no security context
-               assertUIntArg ('done', 'render_image', TRUE);
+               assertUIntArg ('done', __FILE__, TRUE);
                renderProgressBarImage ($_REQUEST['done']);
                break;
+       case 'view': // file security context
+       case 'preview':
+               assertUIntArg ('file_id', __FILE__);
+               $pageno = 'file';
+               $tabno = 'default';
+               fixContext();
+               if (!permitted())
+                       renderAccessDeniedImage();
+               else
+                       renderFilePreview ($_REQUEST['file_id']);
+               break;
        default:
                renderError();
 }
@@ -150,4 +161,27 @@ function renderAccessDeniedImage ()
        imagedestroy ($img);
 }
 
+function renderFilePreview ($file_id = 0)
+{
+       $file = getFile ($file_id);
+       $image = imagecreatefromstring ($file['contents']);
+       $width = imagesx ($image);
+       $height = imagesy ($image);
+       if ($_REQUEST['img'] == 'preview' and ($width > getConfigVar ('PREVIEW_IMAGE_MAXPXS') or $height > getConfigVar ('PREVIEW_IMAGE_MAXPXS')))
+       {
+               // TODO: cache thumbs for faster page generation
+               $ratio = getConfigVar ('PREVIEW_IMAGE_MAXPXS') / max ($width, $height);
+               $newwidth = $width * $ratio;
+               $newheight = $height * $ratio;
+               $resampled = imagecreatetruecolor ($newwidth, $newheight);
+               imagecopyresampled ($resampled, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
+               imagedestroy ($image);
+               $image = $resampled;
+               unset ($resampled);
+       }
+       header("Content-type: image/png"); // don't announce content-length, it may have changed after resampling
+       imagepng ($image);
+       imagedestroy ($image);
+}
+
 ?>
index 344c5da..c37762d 100644 (file)
@@ -156,6 +156,10 @@ CREATE TABLE `FileLink` (
                        $query[] = 'alter table TagStorage add UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`)';
                        $query[] = 'alter table TagStorage add KEY `entity_id` (`entity_id`)';
                        $query[] = "delete from Config where varname = 'USER_AUTH_SRC' limit 1";
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_MAXCHARS','10240','uint','yes','no','Max chars for text file preview')";
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_ROWS','25','uint','yes','no','Rows for text file preview')";
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_COLS','80','uint','yes','no','Columns for text file preview')";
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_IMAGE_MAXPXS','320','uint','yes','no','Max pixels per axis for image file preview')";
                        $query[] = "UPDATE Config SET varvalue = '0.17.0' WHERE varname = 'DB_VERSION'";
                        break;
                default: