/[cvs]/nfo/php/libs/com.newsblob.phphtmllib/form/form_elements/FEFile.inc
ViewVC logotype

Diff of /nfo/php/libs/com.newsblob.phphtmllib/form/form_elements/FEFile.inc

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by jonen, Sat Sep 20 00:20:15 2003 UTC revision 1.3 by jonen, Thu Aug 11 14:09:59 2005 UTC
# Line 4  Line 4 
4   *   *
5   * $Id$   * $Id$
6   *   *
7   * @author Walter A. Boring IV <waboring@buildabetterweb.com>   * @author Walter A. Boring IV <waboring@newsblob.com>
8   * @author Dave Brondsema <dave@brondsema.net>   * @author Dave Brondsema <dave@brondsema.net>
9   * @package phpHtmlLib   * @package phpHtmlLib
10   * @subpackage FormProcessing   * @subpackage FormProcessing
# Line 13  Line 13 
13   *   *
14   */   */
15    
16   /**  /**
17   * This is the FileUpload FormElement which builds a   * This is the FileUpload FormElement which builds a
18   * input field of type="file".   * input field of type="file".  This automagically
19     * handles the case of a confirmation page.
20   *   *
21   * @author Dave Brondsema <dave@brondsema.net>   * @author Dave Brondsema <dave@brondsema.net>
22   * @package phpHtmlLib   * @package phpHtmlLib
# Line 25  Line 26 
26   */   */
27  class FEFile extends FEText {  class FEFile extends FEText {
28    
29    
30        /**
31         * The $_FILES information about
32         * the submitted file.
33         */
34        var $_files_info = array('name' => '',
35                                 'type' => '',
36                                 'size' => '',
37                                 'tmp_name' => '');
38    
39        /**
40         * The place where we temporarily save
41         * the file during confirmation
42         */
43        var $_temp_dir = "/tmp";
44    
45        /**
46         * Array listing mime types to check for
47         * during validation
48         */
49        var $_valid_types = array();
50    
51        /**
52         * max size in bytes determined by user
53         *
54         */
55        var $_max_size;
56    
57      /**      /**
58       * This function builds and returns the       * This function builds and returns the
59       * form element object       * form element object
# Line 32  class FEFile extends FEText { Line 61  class FEFile extends FEText {
61       * @return object       * @return object
62       */       */
63      function get_element() {      function get_element() {
   
64          $attributes = $this->_build_element_attributes();          $attributes = $this->_build_element_attributes();
65          $attributes["type"] = "file";          $attributes["type"] = "file";
66    
# Line 51  class FEFile extends FEText { Line 79  class FEFile extends FEText {
79       * It validates file size and partial uploads..       * It validates file size and partial uploads..
80       * @param FormValidation object.       * @param FormValidation object.
81       */       */
82          function validate(&$_FormValidation) {      function validate(&$_FormValidation) {
83                  switch ($_FILES[$this->get_element_name()]['error'])          
84                  {          if (isset($_REQUEST[FORM_CONFIRM])) {
85                          case 0:                  //looks like we are in confirmation
86                                  if ($_FILES[$this->get_element_name()]['size'] == 0) {                  //we should have a populated array already.
87                                          $this->set_error_message("The uploaded file was empty.");                  if ($this->_files_info['name']) {
88                                          return FALSE;                          //we are ok
89                                  }                          return TRUE;                            
90                                  break;                  } else {
91                          case 1:                          //something bogus happened here.
92                                  $this->set_error_message("The uploaded file exceeds the maximum file size, " . ini_get("upload_max_filesize"));                          $this->set_error_message("The uploaded file was unexpectedly empty.");
93                                  return FALSE;                  return FALSE;                          
94                                  break;                  }
95                          case 2:          }
96                                  $this->set_error_message("The uploaded file exceeds the maximum file size, " . $_REQUEST['MAX_FILE_SIZE'] . " bytes, specified for this form.");          
97                                  return FALSE;          switch ($_FILES[$this->get_element_name()]['error']) {
98                                  break;          case 0:
99                          case 3:              if ($_FILES[$this->get_element_name()]['size'] == 0) {
100                                  $this->set_error_message("The uploaded file was only partially uploaded.");                  $this->set_error_message("The uploaded file was empty.");
101                                  return FALSE;                  return FALSE;
102                                  break;              }
103                          case 4:              break;
104                                  $this->set_error_message("No file was uploaded.");          case 1:
105                                  return FALSE;              $this->set_error_message("The uploaded file exceeds the maximum file size, " .
106                                  break;                                       ini_get("upload_max_filesize"));
107                          case 5:              return FALSE;
108                                  $this->set_error_message("The uploaded file was empty.");              break;
109                                  return FALSE;          case 2:
110                                  break;              $this->set_error_message("The uploaded file exceeds the maximum file size, " .
111                  }                                       $_REQUEST['MAX_FILE_SIZE'] . " bytes, specified for this form.");
112                return FALSE;
113                break;
114            case 3:
115                $this->set_error_message("The uploaded file was only partially uploaded.");
116                return FALSE;
117                break;
118            case 4:
119                //make sure that we are required to have a result
120                if ($this->is_required()) {
121                    $this->set_error_message("No file was uploaded.");
122                    return FALSE;
123                } else {
124                    //we aren't required,
125                    //and we don't have a value.
126                    //this is a special case of
127                    //parent::do_validation
128                    return TRUE;
129                }
130                break;
131    
132            case 5:
133                $this->set_error_message("The uploaded file was empty.");
134                return FALSE;
135                break;
136            }
137    
138            if (!empty($this->_valid_types)) {
139                if (!in_array($_FILES[$this->get_element_name()]['type'], $this->_valid_types)) {
140                    $this->set_error_message('Not a valid file type.');
141                    return FALSE;
142                }
143            }
144    
145            if (!empty($this->_max_size)) {
146                if ($_FILES[$this->get_element_name()]['size'] > $this->_max_size) {
147                    $this->set_error_message('File can be no larger than ' . $this->_max_size . ' bytes');
148                    return FALSE;
149                }
150            }
151    
152          return TRUE;          return TRUE;
153      }      }
154    
155       /**      /**
156       * This function will return the       * This function will return the
157       * elements value       * elements value
158       *       *
159       * @return mixed       * @return mixed
160       */       */
161           function get_value() {      function get_value() {
162                  return @$_FILES[$this->get_element_name()]['name'];          //do we need to repopulate
163          }          //the file_info?
164            if (isset($_REQUEST[FORM_CONFIRM]) && empty($this->_files_info['name'])) {
165                $this->_populate_file_info();
166    
167                //let the FormContent do what they want.
168                return $this->_files_info;
169            } else {
170                if (isset($_FILES[$this->get_element_name()]['name'])) {
171                    return $_FILES[$this->get_element_name()]['name'];
172                } else {
173                    return '';
174                }
175            }        
176        }
177    
178        /**
179         *
180         * @param mixed - the value to look up
181         * @return string - the text associated
182         */
183        function get_value_text() {
184            if (empty($this->_files_info['name'])) {
185                return '';
186            } else {
187                return $this->_files_info['name']." (".
188                    $this->_files_info['type'].") ".
189                    $this->_files_info['size']." bytes";
190            }        
191        }
192    
193        /**
194         * This is so we can save the file information
195         * in a hidden form field during confirmation
196         * page.
197         *
198         * @return string
199         */
200        function get_pre_confirm_value() {
201            return urlencode(serialize($this->_files_info));
202        }
203    
204    
205       /**  
206        /**
207       * This function will return this file's portion of the $_FILES array       * This function will return this file's portion of the $_FILES array
208       *       *
209       * @return array       * @return array
210       */       */
211          function get_file_info() {      function get_file_info() {
212                  return $_FILES[$this->get_element_name()];          return @$_FILES[$this->get_element_name()];
213          }      }
214    
215        /**
216         * This is so the user can set the temp directory
217         * where the file will be saved during confirmation
218         * (if any)
219         *
220         * @param string the new temp dir.
221         */
222        function set_temp_dir($dir) {
223            $this->_temp_dir = $dir;
224        }
225    
226        /**
227         * This is so the user can get the temp directory
228         * where the file was saved during confirmation
229         * (if any)
230         *
231         * @return string the new temp dir.
232         */
233        function get_temp_dir() {
234            return $this->_temp_dir;
235        }
236    
237    
238        /**
239         * The function that allows us to save the
240         * temp file someplace we can use it after
241         * a confirmation has been accepted.
242         *
243         * NOTE: if the user doesn't confirm, then
244         *       this could leave files in /tmp
245         *
246         */
247        function _pre_confirm() {
248            $name = $this->get_element_name();
249            if (!empty($_FILES[$name]['name'])) {
250                //ok we need to move the file so that the web
251                //server doesn't nuke it once the request is done.
252                $this->_files_info['name'] = $_FILES[$name]["name"];
253                $this->_files_info['type'] = $_FILES[$name]['type'];
254                $this->_files_info['size'] = $_FILES[$name]['size'];
255    
256                $tempname = tempnam($this->_temp_dir, get_class($this));
257                $this->_files_info['tmp_name'] = str_replace($this->_temp_dir, '', $tempname);
258                rename($_FILES[$name]['tmp_name'], $tempname);
259            }
260    
261            return TRUE;
262        }
263    
264        /**
265         * This method re-populates the $this->_files_info
266         * because the form had a confirmation page,
267         * and the user accepted the confirmation.
268         *
269         * This is so we can re populate the local private var
270         * so we can get access at the file data on disk.
271         *
272         */
273        function _populate_file_info() {
274            $this->_files_info = unserialize(urldecode($this->_value));
275            $this->_value = $this->_files_info['name'];
276            $this->_files_info['tmp_name'] = $this->_temp_dir.$this->_files_info['tmp_name'];
277        }
278    
279    
280        /**
281         * This method returns the hidden version of this
282         * element for a confirmation page.  
283         *
284         * NOTE: This is called by the FormProcessor only.  
285         * It shouldn't be called manually.
286         *
287         * @return INPUTtag of type hidden
288         */
289        function get_confirm_element() {
290            return form_hidden($this->get_element_name(),
291                               $this->get_pre_confirm_value() );
292        }
293    
294        /**
295         * This is so the user can create a list of mime types
296         * to allow
297         *
298         * @param string a mime type to check for
299         */
300        function add_valid_type($mime_type) {
301            $this->_valid_types[] = $mime_type;
302        }
303    
304        /**
305         * This allows the user to set the max size of the file
306         *
307         * @param integer max size in bytes
308         */
309        function set_max_size($max_size) {
310            $this->_max_size = $max_size;
311        }
312    
313        /**
314         * This allows the user to get the max size of the file
315         * (if any has been set)
316         *
317         * @return integer value of $_max_size if any
318         */
319        function get_max_size($max_size) {
320            return $this->_max_size;
321        }
322  }  }
323    ?>

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.3

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed