[fusion-commits] r2658 - trunk/widgets/Redline/classes

svn_fusion at osgeo.org svn_fusion at osgeo.org
Fri Mar 8 04:33:01 PST 2013


Author: jng
Date: 2013-03-08 04:33:00 -0800 (Fri, 08 Mar 2013)
New Revision: 2658

Modified:
   trunk/widgets/Redline/classes/markupmanager.php
Log:
#551: Add support for downloading SHP-based redlines. Due to the multi-part nature of SHP files (and the deceptive name!), we have to zip the contents of the SHP file up first before serving it out for download.

Modified: trunk/widgets/Redline/classes/markupmanager.php
===================================================================
--- trunk/widgets/Redline/classes/markupmanager.php	2013-03-08 11:49:35 UTC (rev 2657)
+++ trunk/widgets/Redline/classes/markupmanager.php	2013-03-08 12:33:00 UTC (rev 2658)
@@ -131,6 +131,8 @@
             return ".sdf";
         else if (strcmp("OSGeo.SQLite", $fdoProvider) == 0)
             return ".sqlite";
+        else if (strcmp("OSGeo.SHP", $fdoProvider) == 0)
+            return ".zip"; //Need to zip up the SHP file and its associates
         else
             return "";
     }
@@ -486,25 +488,76 @@
     function DownloadMarkup()
     {
         $resourceService = $this->site->CreateService(MgServiceType::ResourceService);
+        $featureService = $this->site->CreateService(MgServiceType::FeatureService);
 
         $markupLayerResId = new MgResourceIdentifier($this->args['MARKUPLAYER']);
         $markupFsId = new MgResourceIdentifier($this->GetResourceIdPrefix() . $markupLayerResId->GetName() . '.FeatureSource');
 
-        $dataName = $markupLayerResId->GetName().$this->GetFileExtension($markupLayerResId->ToString());
-        $byteReader = $resourceService->GetResourceData($markupFsId, $dataName);
-        $len = $byteReader->GetLength();
+        $extension = $this->GetFileExtension($markupLayerResId->ToString());
+        if (strcmp($extension, ".zip") == 0) {
+            $dataList = $resourceService->EnumerateResourceData($markupFsId);
+            $doc = DOMDocument::LoadXML($dataList->ToString());
+            $dataItems = $doc->getElementsByTagName("Name");
+            $tmpFiles = array();
+            //Copy out all data files to a temp location
+            for ($i = 0; $i < $dataItems->length; $i++) {
+                $dataName = $dataItems->item($i)->nodeValue;
+                $byteReader = $resourceService->GetResourceData($markupFsId, $dataName);
+                //Sink to temp file
+                $tmpSink = new MgByteSink($byteReader);
+                $fileName = tempnam(sys_get_temp_dir(), $dataName);
+                $tmpSink->ToFile($fileName);
+                $tmpFiles[$dataName] = $fileName;
+            }
+            //Zip them up.
+            $zipName = $markupLayerResId->GetName().$extension;
+            $zipPath = tempnam(sys_get_temp_dir(), $zipName);
+            $zip = new ZipArchive();
+            $zip->open($zipPath, ZIPARCHIVE::CREATE);
+            foreach ($tmpFiles as $dataName => $filePath) {
+                $zip->addFile($filePath, $dataName);
+            }
+            $zip->close();
 
-        $outputBuffer = '';
-        $buffer = '';
-        while ($byteReader->Read($buffer, 50000) != 0)
-        {
-            $outputBuffer .= $buffer;
+            //Serve it up for download
+            $bs = new MgByteSource($zipPath);
+            $br = $bs->GetReader();
+
+            $len = $br->GetLength();
+
+            $outputBuffer = '';
+            $buffer = '';
+            while ($br->Read($buffer, 50000) != 0)
+            {
+                $outputBuffer .= $buffer;
+            }
+
+            header("Content-Type: application/octet-stream");
+            header("Content-Disposition: attachment; filename=$zipName");
+            header("Content-Length: " . strlen($outputBuffer));
+            echo $outputBuffer;
+            //Let's be nice and clean up after ourselves
+            unlink($zipPath);
+            foreach ($tmpFiles as $dataName => $filePath) {
+                unlink($filePath);
+            }
+        } else { //Single file, make things easier!
+            $dataName = $markupLayerResId->GetName().$extension;
+            $byteReader = $resourceService->GetResourceData($markupFsId, $zipName);
+            $len = $byteReader->GetLength();
+
+            $outputBuffer = '';
+            $buffer = '';
+            while ($byteReader->Read($buffer, 50000) != 0)
+            {
+                $outputBuffer .= $buffer;
+            }
+
+            header("Content-Type: " . $byteReader->GetMimeType());
+            header("Content-Disposition: attachment; filename=$dataName");
+            header("Content-Length: " . strlen($outputBuffer));
+            echo $outputBuffer;
         }
-
-        header("Content-Type: " . $byteReader->GetMimeType());
-        header("Content-Disposition: attachment; filename=$dataName");
-        header("Content-Length: " . strlen($outputBuffer));
-        echo $outputBuffer;
     }
 
     function GetProviderFromExtension($ext)



More information about the fusion-commits mailing list