Search:

CWIS Developers Documentation

  • Main Page
  • Classes
  • Files
  • File List
  • File Members

File.php

Go to the documentation of this file.
00001 <?PHP
00002 
00003 #
00004 #   FILE:  SPT--File.php
00005 #
00006 #   METHODS PROVIDED:
00007 #       File()
00008 #           - constructor
00009 #       SomeMethod($SomeParameter, $AnotherParameter)
00010 #           - short description of method
00011 #
00012 #   AUTHOR:  Edward Almasy
00013 #
00014 #   Part of the Collection Workflow Integration System
00015 #   Copyright 2007 Edward Almasy and Internet Scout
00016 #   http://scout.wisc.edu
00017 #
00018 
00019 
00020 class File {
00021 
00022     # ---- PUBLIC INTERFACE --------------------------------------------------
00023 
00024     
00025     # status codes (set by constructor and returned by File::Status())
00026     const FILESTAT_OK =             0;
00027     const FILESTAT_COPYERROR =      1;
00028     const FILESTAT_PARAMERROR =     2;
00029     const FILESTAT_ZEROLENGTH =     3;
00030     const FILESTAT_DOESNOTEXIST =   4;
00031     const FILESTAT_UNREADABLE =     5;
00032 
00033     # object constructor
00034     function File($IdOrFileName, $ResourceId = NULL, $FieldId = NULL, 
00035             $DesiredFileName = NULL, $CheckFileLength = TRUE)
00036     {
00037         # assume constructor will succeed
00038         $this->Status = File::FILESTAT_OK;
00039 
00040         # get our own database handle
00041         $DB = new SPTDatabase();
00042         $this->DB = $DB;
00043 
00044         # if ID supplied
00045         if (is_int($IdOrFileName))
00046         {
00047             # set file ID from supplied value
00048             $this->Id = intval($IdOrFileName);
00049 
00050             # load file info from database
00051             $DB->Query("SELECT * FROM Files WHERE FileId = ".$this->Id);
00052             $this->DBFields = $DB->FetchRow();
00053         }
00054         # else if file name and resource ID and field ID supplied
00055         elseif (strlen($IdOrFileName) && ($ResourceId != NULL) && ($FieldId != NULL))
00056         {
00057             # if file does not exist
00058             $TempFileName = $IdOrFileName;
00059             if (!file_exists($TempFileName) || !is_readable($TempFileName))
00060             {
00061                 # set status indicating appropriate error
00062                 $this->Status = file_exists($TempFileName) 
00063                         ? File::FILESTAT_DOESNOTEXIST : File::FILESTAT_UNREADABLE;
00064             }
00065             else
00066             {
00067                 # if we were asked to check file length and file was zero length
00068                 $FileLength = filesize($TempFileName);
00069                 if ($CheckFileLength && !$FileLength)
00070                 {
00071                     # set status indicating zero length file
00072                     $this->Status = File::FILESTAT_ZEROLENGTH;
00073                 }
00074                 else
00075                 {
00076                     # generate secret string (used to protect from unauthorized download)
00077                     srand((double)microtime() * 1000000);
00078                     $SecretString = sprintf("%04X", rand(1, 30000));
00079     
00080                     # attempt to get file type
00081                     if (function_exists("finfo_open"))
00082                     {
00083                         $FInfoHandle = finfo_open(FILEINFO_MIME);
00084                         $FileType = finfo_file($FInfoHandle, $TempFileName);
00085                         finfo_close($FInfoHandle);
00086                     }
00087                     else
00088                     {
00089                         $FileType = "";
00090                     }
00091     
00092                     # add file info to database
00093                     $BaseFileName = $DesiredFileName 
00094                             ? basename($DesiredFileName) : basename($TempFileName);
00095                     $DB->Query("INSERT INTO Files"
00096                             ." (ResourceId, FieldId, FileName, FileLength, FileType,"
00097                                 ." SecretString)"
00098                             ." VALUES ("
00099                                 .intval($ResourceId).", "
00100                                 .intval($FieldId).", "
00101                                 ."'".addslashes($BaseFileName)."', "
00102                                 .$FileLength.", "
00103                                 ."'".$FileType."', "
00104                                 ."'".$SecretString."')");
00105         
00106                     # retrieve ID of new file
00107                     $this->Id = $DB->LastInsertId("Files");
00108     
00109                     # load file info back in from database
00110                     $DB->Query("SELECT * FROM Files WHERE FileId = ".$this->Id);
00111                     $this->DBFields = $DB->FetchRow();
00112         
00113                     # copy file to storage
00114                     $CopySucceeded = copy($IdOrFileName, $this->GetNameOfStoredFile());
00115         
00116                     # if copy failed
00117                     if (!$CopySucceeded)
00118                     {
00119                         # remove file info from database
00120                         $DB->Query("DELETE FROM Files WHERE FileId = ".$this->Id);
00121         
00122                         # set status indicating constructor failed
00123                         $this->Status = File::FILESTAT_COPYERROR;
00124                     }
00125                 }
00126             }
00127         }
00128         else
00129         {
00130             # set status indicating constructor failed
00131             $this->Status = File::FILESTAT_PARAMERROR;
00132         }
00133     }
00134 
00135     # return object status (used to report errors occurring in constructor)
00136     function Status() {  return $this->Status;  }
00137 
00138     # get various attributes
00139     function Id() {  return $this->Id;  }
00140     function Name() {  return $this->DBFields["FileName"];  }
00141     function GetLength() {  return $this->DBFields["FileLength"];  }
00142     function GetType() {  return $this->DBFields["FileType"];  }
00143 
00144     # get/set various attributes
00145     function Comment($NewValue = DB_NOVALUE)
00146             {  return $this->UpdateValue("FileComment", $NewValue);  }
00147     function FieldId($NewValue = DB_NOVALUE)
00148             {  return $this->UpdateValue("FieldId", $NewValue);  }
00149     function ResourceId($NewValue = DB_NOVALUE)
00150             {  return $this->UpdateValue("ResourceId", $NewValue);  }
00151 
00152     # get MIME type (defaults to "application/octet-stream" if not available)
00153     function GetMimeType()
00154     {
00155         return strlen($this->GetType()) 
00156                 ? $this->GetType() : "application/octet-stream";
00157     }
00158 
00159     # get link for downloading file
00160     function GetLink()
00161     {
00162         global $NavDirCorrection;
00163         return $NavDirCorrection."SPT--DownloadFile.php?Id=".$this->Id;
00164     }
00165 
00166     # delete file (other methods are invalid after calling this!)
00167     function Delete()
00168     {
00169         # remove file entry from DB
00170         $this->DB->Query("DELETE FROM Files WHERE FileId = ".$this->Id);
00171 
00172         # delete file
00173         unlink($this->GetNameOfStoredFile());
00174     }
00175 
00176     # retrieve actual name of stored file
00177     function GetNameOfStoredFile()
00178     {
00179         global $NavDirCorrection;
00180         return sprintf($NavDirCorrection."FileStorage/%06d-%s-%s", 
00181                 $this->Id, $this->DBFields["SecretString"], $this->Name());
00182     }
00183 
00184 
00185     # ---- PRIVATE INTERFACE -------------------------------------------------
00186 
00187     var $DB;
00188     var $Status;
00189     var $Id;
00190     var $DBFields;
00191 
00192     # convenience function to supply parameters to Database->UpdateValue()
00193     function UpdateValue($FieldName, $NewValue)
00194     {
00195         return $this->DB->UpdateValue("Files", $FieldName, $NewValue,
00196                                "FileId = ".intval($this->Id),
00197                                $this->DBFields, TRUE);
00198     }
00199 }
00200 
00201 
00202 ?>
CWIS logo doxygen
Copyright 2009 Internet Scout