1

codeigniterによるマルチアップロード画像が必要で、次のライブラリから使用します。私の問題は、いくつかの(マルチ)画像を選択した後、出力(php)に画像だけが表示されることです。たとえば、次のようになります。

マルチイメージを次のように選択した場合:

image1.gif | image2.gif | image3.gif

アップロードするだけです:

image3.gif

その間、画像のアップロードには制御機能‍‍ <code> foreachを使用していますが、問題ありません。

<input type="file" name="userfile[]" >

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Multi_upload
{
    function Multi_upload()
    {
        //      $CI =& get_instance();
    }

    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;
        }
    }

    // --------------------------------------------------------------------

    /**
     * Set Image Properties
     *
     * Uses GD to determine the width/height/type of image
     *
     * @access    public
     * @param    string
     * @return    void
     */
    function multiple_image_properties($path = '')
    {
        $CI =& get_instance();
        if (!$CI->upload->is_image()) {
            return false;
        }

        if (function_exists('getimagesize')) {
            if (FALSE !== ($D = @getimagesize($path))) {
                $types = array(
                    1 => 'gif',
                    2 => 'jpeg',
                    3 => 'png'
                );

                $image->width      = $D['0'];
                $image->height     = $D['1'];
                $image->image_type = (!isset($types[$D['2']])) ? 'unknown' : $types[$D['2']];

                return $image;
            }
        }
    }

    // --------------------------------------------------------------------

    /**
     * Set an error message
     *
     * @access    public
     * @param    string
     * @return    void
     */
    function set_error($msg)
    {
        $CI =& get_instance();
        $CI->lang->load('upload');

        if (is_array($msg)) {
            foreach ($msg as $val) {
                $msg               = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val);
                $this->error_msg[] = $msg;
                log_message('error', $msg);
            }
        } else {
            $msg               = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);
            $this->error_msg[] = $msg;
            log_message('error', $msg);
        }
    }

    // --------------------------------------------------------------------
}
?>

この問題をどのように解決しますか?

4

3 に答える 3

0

以下のコードを見てください。これが欲しいと思います。

新しいファイルをアップロードするたびに、各ファイルの構成を$ this-> upload-> initialize($ config);に初期化する必要があります。

// Has the form been posted?
if (isset($_POST['submit']))
{
    // Load the library - no config specified here
    $this->load->library('upload');

    // Check if there was a file uploaded - there are other ways to
    // check this such as checking the 'error' for the file - if error
    // is 0, you are good to code
    if (!empty($_FILES['userfile']['name']))
    {
        // Specify configuration for File 1
        $config['upload_path'] = 'uploads/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';      

        // Initialize config for File 1
        $this->upload->initialize($config);

        // Upload file 1
        if ($this->upload->do_upload('userfile'))
        {
            $data = $this->upload->data();
        }
        else
        {
            echo $this->upload->display_errors();
        }

    }

    // Do we have a second file?
    if (!empty($_FILES['userfile1']['name']))
    {
        // Config for File 2 - can be completely different to file 1's config
        // or if you want to stick with config for file 1, do nothing!
        $config['upload_path'] = 'uploads/dir2/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';

        // Initialize the new config
        $this->upload->initialize($config);

        // Upload the second file
        if ($this->upload->do_upload('userfile1'))
        {
            $data = $this->upload->data();
        }
        else
        {
            echo $this->upload->display_errors();
        }

    }
}
else
{
    $this->load->view("upload_form");
}
于 2012-11-19T12:12:58.723 に答える
0

マルチアップロード機能については、このすばらしいライブラリも試してみてください。素晴らしいインターフェースと高速パフォーマンス。

http://www.plupload.com/

于 2012-11-19T12:30:09.370 に答える
0

追加のライブラリを必要としないきちんとしたアプローチは、属性と一緒のこのコードです。multiple=""

UIを使用して一度に複数のファイルを選択することの快適さを過小評価しないでください。

于 2012-11-19T13:06:52.707 に答える