忽略错误需要选择文件

时间:2011-10-12 07:34:40

标签: php arrays codeigniter

我想在codeigniter中使用多个上传图片,但问题在于如果不选择图片进行上传则返回为假,如果我不想选择要上传的图片,则重定向到我的网址(只需忽略)错误要求选择文件)。如何在函数go_upload中修复它?

我的功能:

<?php
function go_upload($field = 'userfile')
{
    $CI =& get_instance();
    // Is $_FILES[$field] set? If not, no reason to continue.
    if (!isset($_FILES[$field]['name'][0])) {
        $CI->upload->set_error('upload_no_file_selected');
        return FALSE;
    } else {
        $num_files    = count($_FILES[$field]['name']) - 1;
        $file_list    = array();
        $error_hold   = array();
        $error_upload = FALSE;
    }

    // Is the upload path valid?
    if (!$CI->upload->validate_upload_path()) {
        // errors will already be set by validate_upload_path() so just return FALSE
        return FALSE;
    }

    for ($i = 0; $i < $num_files; $i++) {
        //            $fname = $_FILES[$field]['name'][$i];
        //            echo "$fname\n\n<br><br>\n\n";

        $error_hold[$i] = FALSE;

        // Was the file able to be uploaded? If not, determine the reason why.
        if (!is_uploaded_file($_FILES[$field]['tmp_name'][$i])) {
            $error = (!isset($_FILES[$field]['error'][$i])) ? 4 : $_FILES[$field]['error'][$i];

            switch ($error) {
                case 1: // UPLOAD_ERR_INI_SIZE
                    $error_hold[$i] = 'upload_file_exceeds_limit';
                    break;
                case 2: // UPLOAD_ERR_FORM_SIZE
                    $error_hold[$i] = 'upload_file_exceeds_form_limit';
                    break;
                case 3: // UPLOAD_ERR_PARTIAL
                    $error_hold[$i] = 'upload_file_partial';
                    break;
                case 4: // UPLOAD_ERR_NO_FILE
                    $error_hold[$i] = 'upload_no_file_selected';
                    break;
                case 6: // UPLOAD_ERR_NO_TMP_DIR
                    $error_hold[$i] = 'upload_no_temp_directory';
                    break;
                case 7: // UPLOAD_ERR_CANT_WRITE
                    $error_hold[$i] = 'upload_unable_to_write_file';
                    break;
                case 8: // UPLOAD_ERR_EXTENSION
                    $error_hold[$i] = 'upload_stopped_by_extension';
                    break;
                default:
                    $error_hold[$i] = 'upload_no_file_selected';
                    break;
            }

            return FALSE;
        }

        // Set the uploaded data as class variables
        $CI->upload->file_temp = $_FILES[$field]['tmp_name'][$i];
        $CI->upload->file_name = $CI->upload->file_name = $_FILES[$field]['name'][$i];
        $CI->upload->file_size = $_FILES[$field]['size'][$i];
        $CI->upload->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type'][$i]);
        $CI->upload->file_type = strtolower($CI->upload->file_type);
        $CI->upload->file_ext  = $CI->upload->get_extension($_FILES[$field]['name'][$i]);

        // Convert the file size to kilobytes
        if ($CI->upload->file_size > 0) {
            $CI->upload->file_size = round($CI->upload->file_size / 1024, 2);
        }

        // Is the file type allowed to be uploaded?
        if (!$CI->upload->is_allowed_filetype()) {
            $error_hold[$i] = 'upload_invalid_filetype';
        }

        // Is the file size within the allowed maximum?
        if (!$CI->upload->is_allowed_filesize()) {
            $error_hold[$i] = 'upload_invalid_filesize';
        }

        // Are the image dimensions within the allowed size?
        // Note: This can fail if the server has an open_basdir restriction.
        if (!$CI->upload->is_allowed_dimensions()) {
            $error_hold[$i] = 'upload_invalid_dimensions';
        }

        // Sanitize the file name for security
        $CI->upload->file_name = $CI->upload->clean_file_name($CI->upload->file_name);

        // Remove white spaces in the name
        if ($CI->upload->remove_spaces == TRUE) {
            $CI->upload->file_name = preg_replace("/\s+/", "_", $CI->upload->file_name);
        }

        /*
         * Validate the file name
         * This function appends an number onto the end of
         * the file if one with the same name already exists.
         * If it returns false there was a problem.
         */
        $CI->upload->orig_name = $CI->upload->file_name;

        if ($CI->upload->overwrite == FALSE) {
            $CI->upload->file_name = $CI->upload->set_filename($CI->upload->upload_path, $CI->upload->file_name);

            if ($CI->upload->file_name === FALSE) {
                $error_hold[$i] = TRUE;
            }
        }

        /*
         * Move the file to the final destination
         * To deal with different server configurations
         * we'll attempt to use copy() first.  If that fails
         * we'll use move_uploaded_file().  One of the two should
         * reliably work in most environments
         */
        if (!@copy($CI->upload->file_temp, $CI->upload->upload_path . $CI->upload->file_name)) {
            if (!@move_uploaded_file($CI->upload->file_temp, $CI->upload->upload_path . $CI->upload->file_name)) {
                $error_hold[$i] = 'upload_destination_error';
            }
        }

        /*
         * Run the file through the XSS hacking filter
         * This helps prevent malicious code from being
         * embedded within a file.  Scripts can easily
         * be disguised as images or other file types.
         */
        if ($CI->upload->xss_clean == TRUE) {
            $CI->upload->do_xss_clean();
        }

        if ($error_hold[$i]) {
            $error_upload = TRUE;

            //                echo $error_hold[$i];
        } else {
            if ($imageVar = $this->multiple_image_properties($CI->upload->upload_path . $CI->upload->file_name)) {
                $file_list[] = array(
                    'name' => $CI->upload->file_name,
                    'file' => $CI->upload->upload_path . $CI->upload->file_name,
                    'size' => $CI->upload->file_size,
                    'ext' => $CI->upload->file_ext,
                    'image_type' => $imageVar->image_type,
                    'height' => $imageVar->height,
                    'width' => $imageVar->width
                );
            } else {
                $file_list[] = array(
                    'name' => $CI->upload->file_name,
                    'file' => $CI->upload->upload_path . $CI->upload->file_name,
                    'size' => $CI->upload->file_size,
                    'type' => $CI->upload->file_type,
                    'ext' => $CI->upload->file_ext
                );
            }
        }

        // For debugging

        /*            
        if (strlen($error_hold[$i]) > 1) {
        print_r($error_hold);
        }
        */
    } // end for loop

    // Add error display for individual files        
    if ($error_upload) {
        $this->set_error($error_hold);
        return FALSE;
    } else {
        return $file_list;
    }
}
?>

我的CI_Controller:

$config['upload_path'] = './uploads/'; // server directory
$config['allowed_types'] = 'gif|jpg|png'; // by extension, will check for whether it is an image
$config['max_size']    = '1000'; // in kb
$config['max_width']  = '1024';
$config['max_height']  = '768';

$this->upload->initialize($config);
$this->load->library('Multi_upload');

$files = $this->multi_upload->go_upload();    
if ( ! $files )
{
    $error = array('error' => $this->upload->display_errors());                         
    print_r($error);
    return false;
}
else
{
$data3 = array();
foreach ($files as $idx => $name) {
    //var_dump($name['name']);
    $data3[] = array(
        'relation' => $query_hi->id,
        'images' => $name['name'],
    );
};
}
$this->db->insert_batch('hotel_image', $data3);
redirect('admin/residence/insert');

1 个答案:

答案 0 :(得分:0)

我会尝试看看里面的内容。

$_FILES

数组,即当帖子论坛也有图像时,php启动的数组。如果您的控制器在那里检查以确保存在图像应该是避免该错误的好方法。