CodeIgniter 文件上傳類(lèi)

2018-07-21 15:39 更新

文件上傳類(lèi)

CodeIgniter 的文件上傳類(lèi)用于上傳文件,你可以設(shè)置參數(shù)限制上傳文件的類(lèi)型和大小。

處理流程

上傳一個(gè)文件通常涉及以下幾步:

  • 顯示一個(gè)上傳表單,用戶(hù)選擇文件并上傳。
  • 當(dāng)提交表單時(shí),文件將被上傳到你指定的目錄。
  • 同時(shí),根據(jù)你設(shè)置的參數(shù)對(duì)文件進(jìn)行校驗(yàn)是否允許上傳。
  • 上傳成功后,向用戶(hù)顯示成功消息。

下面是個(gè)簡(jiǎn)單的教程來(lái)示范該過(guò)程,然后會(huì)列出一些其他的參考信息。

創(chuàng)建上傳表單

使用文本編輯器新建一個(gè)文件 upload_form.php ,放入如下代碼,并保存到 application/views/ 目錄下:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<?php echo $error;?>

<?php echo form_open_multipart('upload/do_upload');?>

<input type="file" name="userfile" size="20" />

<br /><br />

<input type="submit" value="upload" />

</form>

</body>
</html>

你會(huì)注意到我們使用了表單輔助函數(shù)來(lái)創(chuàng)建 form 的起始標(biāo)簽,文件上傳需要使用 multipart 表單, 輔助函數(shù)可以幫你正確生成它。還要注意的是,代碼里有一個(gè) $error 變量,當(dāng)發(fā)生錯(cuò)誤時(shí), 可以用它來(lái)顯示錯(cuò)誤信息。

上傳成功頁(yè)面

使用文本編輯器新建一個(gè)文件 upload_success.php ,放入如下代碼,并保存到 application/views/ 目錄下:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<h3>Your file was successfully uploaded!</h3>

<ul>
<?php foreach ($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?php endforeach; ?>
</ul>

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p>

</body>
</html>

控制器

使用文本編輯器新建一個(gè)控制器 Upload.php ,放入如下代碼,并保存到 application/controllers/ 目錄下:

<?php

class Upload extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->helper(array('form', 'url'));
    }

    public function index()
    {
        $this->load->view('upload_form', array('error' => ' ' ));
    }

    public function do_upload()
    {
        $config['upload_path']      = './uploads/';
        $config['allowed_types']    = 'gif|jpg|png';
        $config['max_size']     = 100;
        $config['max_width']        = 1024;
        $config['max_height']       = 768;

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

        if ( ! $this->upload->do_upload('userfile'))
        {
            $error = array('error' => $this->upload->display_errors());

            $this->load->view('upload_form', $error);
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());

            $this->load->view('upload_success', $data);
        }
    }
}
?>

上傳文件目錄

你需要一個(gè)目錄來(lái)保存上傳的圖片,在 CodeIgniter 的安裝根目錄下創(chuàng)建一個(gè) uploads 目錄, 并將它的權(quán)限設(shè)置為 777 。

嘗試一下!

使用類(lèi)似于下面的 URL 來(lái)方法你的站點(diǎn):

example.com/index.php/upload/

你應(yīng)該能看到一個(gè)上傳文件的表單,嘗試著上傳一個(gè)圖片文件(jpg、gif 或 png 都可以), 如果你的控制器中路徑設(shè)置正確,你就可以成功上傳文件了。

參考指南

初始化文件上傳類(lèi)

正如 CodeIgniter 中的其他類(lèi)一樣,在你的控制器中使用 $this->load->library() 方法來(lái)初始化文件上傳類(lèi):

$this->load->library('upload');

初始化之后,文件上傳類(lèi)的對(duì)象就可以這樣訪問(wèn):

$this->upload

參數(shù)設(shè)置

和其他的類(lèi)庫(kù)一樣,你可以通過(guò)你配置的參數(shù)來(lái)控制允許上傳什么類(lèi)型的文件。 在上面的控制器中,你設(shè)置了下面的這些參數(shù):

$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';

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

// Alternately you can set preferences by calling the ``initialize()`` method. Useful if you auto-load the class:
$this->upload->initialize($config);

上面的參數(shù)根據(jù)它的名稱(chēng)就能很容易理解,下表列出了所有可用的參數(shù)。

參數(shù)

下表列出了所有可用的參數(shù),當(dāng)沒(méi)有指定參數(shù)時(shí)程序會(huì)使用默認(rèn)值。

參數(shù) 默認(rèn)值 選項(xiàng) 描述
upload_path None None 文件上傳的位置,必須是可寫(xiě)的,可以是相對(duì)路徑或絕對(duì)路徑
allowed_types None None 允許上的文件 MIME 類(lèi)型,通常文件的后綴名可作為 MIME 類(lèi)型 可以是數(shù)組,也可以是以管道符( )分割的字符串
file_name None Desired file name 如果設(shè)置了,CodeIgniter 將會(huì)使用該參數(shù)重命名上傳的文件 設(shè)置的文件名后綴必須也要是允許的文件類(lèi)型 如果沒(méi)有設(shè)置后綴,將使用原文件的后綴名
file_ext_tolower FALSE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,文件后綴名將轉(zhuǎn)換為小寫(xiě)
overwrite FALSE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,上傳的文件如果和已有的文件同名,將會(huì)覆蓋已存在文件 如果設(shè)置為 FALSE ,將會(huì)在文件名后加上一個(gè)數(shù)字
max_size 0 None 允許上傳文件大小的最大值(單位 KB),設(shè)置為 0 表示無(wú)限制 注意:大多數(shù) PHP 會(huì)有它們自己的限制值,定義在 php.ini 文件中 通常是默認(rèn)的 2 MB (2048 KB)。
max_width 0 None 圖片的最大寬度(單位為像素),設(shè)置為 0 表示無(wú)限制
max_height 0 None 圖片的最大高度(單位為像素),設(shè)置為 0 表示無(wú)限制
min_width 0 None 圖片的最小寬度(單位為像素),設(shè)置為 0 表示無(wú)限制
min_height 0 None 圖片的最小高度(單位為像素),設(shè)置為 0 表示無(wú)限制
max_filename 0 None 文件名的最大長(zhǎng)度,設(shè)置為 0 表示無(wú)限制
max_filename_increment 100 None 當(dāng) overwrite 參數(shù)設(shè)置為 FALSE 時(shí),將會(huì)在同名文件的后面加上一個(gè)自增的數(shù)字 這個(gè)參數(shù)用于設(shè)置這個(gè)數(shù)字的最大值
encrypt_name FALSE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,文件名將會(huì)轉(zhuǎn)換為一個(gè)隨機(jī)的字符串 如果你不希望上傳文件的人知道保存后的文件名,這個(gè)參數(shù)會(huì)很有用
remove_spaces TRUE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,文件名中的所有空格將轉(zhuǎn)換為下劃線,推薦這樣做
detect_mime TRUE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,將會(huì)在服務(wù)端對(duì)文件類(lèi)型進(jìn)行檢測(cè),可以預(yù)防代碼注入攻擊 除非不得已,請(qǐng)不要禁用該選項(xiàng),這將導(dǎo)致安全風(fēng)險(xiǎn)
mod_mime_fix TRUE TRUE/FALSE (boolean) 如果設(shè)置為 TRUE ,那么帶有多個(gè)后綴名的文件將會(huì)添加一個(gè)下劃線后綴 這樣可以避免觸發(fā) Apache mod_mime 。 如果你的上傳目錄是公開(kāi)的,請(qǐng)不要關(guān)閉該選項(xiàng),這將導(dǎo)致安全風(fēng)險(xiǎn)

在配置文件中設(shè)置參數(shù)

如果你不喜歡使用上面的方法來(lái)設(shè)置參數(shù),你可以將參數(shù)保存到配置文件中。你只需簡(jiǎn)單的創(chuàng)建一個(gè)文件 upload.php 并將 $config 數(shù)組放到該文件中,然后保存文件到 config/upload.php ,這些參數(shù)將會(huì)自動(dòng)被使用。 如果你在配置文件中設(shè)置參數(shù),那么你就不需要使用$this->upload->initialize() 方法了。

類(lèi)參考

classCI_Upload

initialize([array $config = array()[, $reset = TRUE]])

參數(shù):

  • $config (array) -- Preferences
  • $reset (bool) -- Whether to reset preferences (that are not provided in $config) to their defaults

返回:

CI_Upload instance (method chaining)

返回類(lèi)型:

CI_Upload

do_upload([$field = 'userfile'])

參數(shù):

  • $field (string) -- Name of the form field

返回:

TRUE on success, FALSE on failure

返回類(lèi)型:

bool

根據(jù)你設(shè)置的參數(shù)上傳文件。

注解

默認(rèn)情況下上傳文件是來(lái)自于表單的 userfile 字段,而且表單應(yīng)該是 "multipart" 類(lèi)型。

<form method="post" action="some_action" enctype="multipart/form-data" />

如果你想設(shè)置你自己的字段,可以將字段名傳給 do_upload() 方法:

$field_name = "some_field_name";
$this->upload->do_upload($field_name);

display_errors([$open = ''[, $close = '']])

參數(shù):

  • $open (string) -- Opening markup
  • $close (string) -- Closing markup

返回: Formatted error message(s)

返回類(lèi)型: string

如果 do_upload() 方法返回 FALSE ,可以使用該方法來(lái)獲取錯(cuò)誤信息。 該方法返回所有的錯(cuò)誤信息,而不是是直接顯示出來(lái)。

格式化錯(cuò)誤信息

默認(rèn)情況下該方法會(huì)將錯(cuò)誤信息包在 標(biāo)簽中,你可以設(shè)置你自己的標(biāo)簽:

$this->upload->display_errors('<p>', '</p>');

data([$index = NULL])

參數(shù):

  • $data (string) -- Element to return instead of the full array

返回: Information about the uploaded file

返回類(lèi)型: mixed

該方法返回一個(gè)數(shù)組,包含你上傳的文件的所有信息,下面是數(shù)組的原型:

Array
(
    [file_name] => mypic.jpg
    [file_type] => image/jpeg
    [file_path] => /path/to/your/upload/
    [full_path] => /path/to/your/upload/jpg.jpg
    [raw_name]  => mypic
    [orig_name] => mypic.jpg
    [client_name]   => mypic.jpg
    [file_ext]  => .jpg
    [file_size] => 22.2
    [is_image]  => 1
    [image_width]   => 800
    [image_height]  => 600
    [image_type]    => jpeg
    [image_size_str] => width="800" height="200"
)

你也可以只返回?cái)?shù)組中的一項(xiàng):

$this->upload->data('file_name');   // Returns: mypic.jpg

下表解釋了上面列出的所有數(shù)組項(xiàng):

項(xiàng) 描述
file_name 上傳文件的文件名,包含后綴名
file_type 文件的 MIME 類(lèi)型
file_path 文件的絕對(duì)路徑
full_path 文件的絕對(duì)路徑,包含文件名
raw_name 文件名,不含后綴名
orig_name 原始的文件名,只有在使用了 encrypt_name 參數(shù)時(shí)該值才有用
client_name 用戶(hù)提交過(guò)來(lái)的文件名,還沒(méi)有對(duì)該文件名做任何處理
file_ext 文件后綴名,包括句點(diǎn)
file_size 文件大?。▎挝?kb)
is_image 文件是否為圖片(1 = image. 0 = not.)
image_width 圖片寬度
image_height 圖片高度
image_type 圖片類(lèi)型(通常是不帶句點(diǎn)的文件后綴名)
image_size_str 一個(gè)包含了圖片寬度和高度的字符串(用于放在 image 標(biāo)簽中)
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)