< Day Day Up > |
13.6 Uploading Files in FormsThe <input type="file"> form element lets a user upload the entire contents of a file to your server. When a form that includes a file element is submitted, the PHP interpreter provides access to the uploaded file through the $_FILES auto-global array. Example 13-8 shows a form-processing program whose validate_form( ) and process_form( ) functions use $_FILES. Example 13-8. A file upload formif ($_POST['_stage']) { // If validate_form( ) returns errors, pass them to show_form( ) if ($form_errors = validate_form( )) { show_form($form_errors); } else { // The submitted data is valid, so process it process_form( ); } } else { // The form wasn't submitted, so display show_form( ); } function show_form($errors = '') { if ($errors) { print 'You need to correct the following errors: <ul><li>'; print implode('</li><li>',$errors); print '</li></ul>'; } print<<<_HTML_ <form enctype="multipart/form-data" method="POST" action="$_SERVER[PHP_SELF]"> File to Upload: <input name="my_file" type="file"/> <input type="hidden" name="MAX_FILE_SIZE" value="131072"/> <input type="hidden" name="_stage" value="1"> <input type="submit" value="Upload"/> </form> _HTML_; } function validate_form( ) { $errors = array( ); if (($_FILES['my_file']['error'] = = UPLOAD_ERR_INI_SIZE)|| ($_FILES['my_file']['error'] = = UPLOAD_ERR_FORM_SIZE)) { $errors[ ] = 'Uploaded file is too big.'; } elseif ($_FILES['my_file']['error'] = = UPLOAD_ERR_PARTIAL) { $errors[ ] = 'File upload was interrupted.'; } elseif ($_FILES['my_file']['error'] = = UPLOAD_ERR_NO_FILE) { $errors[ ] = 'No file uploaded.'; } return $errors; } function process_form( ) { print "You uploaded a file called {$_FILES['my_file']['name']} "; print "of type {$_FILES['my_file']['type']} that is "; print "{$_FILES['my_file']['size']} bytes long."; $safe_filename = str_replace('/', '', $_FILES['my_file']['name']); $safe_filename = str_replace('..', '', $safe_filename); $destination_file = '/usr/local/uploads/' . $safe_filename; if (move_uploaded_file($_FILES['my_file']['tmp_name'], $destination_file)) { print "Successfully saved file as $destination_file."; } else { print "Couldn't save file in /usr/local/uploads."; } } The process_form( ) function in Example 13-8 uses the techniques from Example 10-23 to sanitize the uploaded filename and the built-in function move_uploaded_file( ) to relocate the uploaded file to a permanent place. These steps prevent security problems that can result from sloppy handling of uploaded files. The file_uploads and upload_max_filesize configuration directives, described in Table A-1, also affect the PHP interpreter's file upload-related behavior. Read more about file upload in Sections 7.4.8 and 12.3 of Programming PHP (O'Reilly), PHP Cookbook (O'Reilly) in Recipe 9.6, and in the PHP Manual (http://www.php.net/manual/features.file-upload.php). |
< Day Day Up > |