Codeigniter里的無刷新上傳的實(shí)現(xiàn)代碼
好久沒有更新了,寫點(diǎn)吧算是翻譯吧,純原創(chuàng)沒空啊XD
Codeigniter還是很好用的,淡水一直很推崇。說是codeigniter里的無刷新上傳吧,fashion 一點(diǎn)的說法就是利用AJAX技術(shù)上傳。其中用到了Jquery和 AjaxFileUpload 。
先建個表
CREATE TABLE `files` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `filename` VARCHAR(255) NOT NULL, `title` VARCHAR(100) NOT NULL );
文件的目錄結(jié)構(gòu)如下:
public_html/ - application/ ―- controllers/ ―― upload.php ―- models/ ―― files_model.php ―- views/ ―― upload.php ―― files.php - css/ ―- style.css - files/ - js/ ―- AjaxFileUpload.js ―- site.js
第一步,建立表單
看上去就一個title文本字段,一個文件框,一個提交按鈕,還有一個files的div。
控制器部分
首先,我們要建一個上傳的表單和一個upload的Controller。在index方法里渲出upload的視圖。如下:
class Upload extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('files_model');
$this->load->database();
$this->load->helper('url');
}
public function index()
{
$this->load->view('upload');
}
}
我們已經(jīng)在構(gòu)造里加載了files_model,所以可以使用files_model里的方法。
建立表單視圖
視圖文件upload.php,包含了我們的上傳表單。
<!doctype html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script src="<?php echo base_url()?>js/site.js"></script> <script src="<?php echo base_url()?>js/ajaxfileupload.js"></script> <link href="<?php echo base_url()?>css/style.css" rel="external nofollow" rel="stylesheet" /> </head> <body> <h1>Upload File</h1> <form method="post" action="" id="upload_file"> <label for="title">Title</label> <input type="text" name="title" id="title" value="" /> <label for="userfile">File</label> <input type="file" name="userfile" id="userfile" size="20" /> <input type="submit" name="submit" id="submit" /> </form> <h2>Files</h2> <div id="files"></div> </body> </html>
我們在文件開始就加載了jquery,ajaxfileupload和我們自己的site.js文件。Id為files的div是我們顯示上傳文件列表用的。
一些簡單的css
在css下建立style.css
h1, h2 { font-family: Arial, sans-serif; font-size: 25px; }
h2 { font-size: 20px; }
label { font-family: Verdana, sans-serif; font-size: 12px; display: block; }
input { padding: 3px 5px; width: 250px; margin: 0 0 10px; }
input[type="file"] { padding-left: 0; }
input[type="submit"] { width: auto; }
#files { font-family: Verdana, sans-serif; font-size: 11px; }
#files strong { font-size: 13px; }
#files a { float: right; margin: 0 0 5px 10px; }
#files ul { list-style: none; padding-left: 0; }
#files li { width: 280px; font-size: 12px; padding: 5px 0; border-bottom: 1px solid #CCC; }
第二步,Javascript
在js下建立site.js
$(function() {
$('#upload_file').submit(function(e) {
e.preventDefault();
$.ajaxFileUpload({
url :'./upload/upload_file/',
secureuri :false,
fileElementId :'userfile',
dataType : 'json',
data : {
'title' : $('#title').val()
},
success : function (data, status)
{
if(data.status != 'error')
{
$('#files').html('<p>Reloading files...</p>');
refresh_files();
$('#title').val('');
}
alert(data.msg);
}
});
return false;
});
});
Javascript劫持了表單的提交,并由ajaxfileupload接管。其實(shí)是在后臺創(chuàng)建了一個iframe并提交了數(shù)據(jù)。
我只是ajax提交了#title的值,可以通過參數(shù)提交更多的字段。
檢查返回的json數(shù)據(jù),如果沒有錯誤,就刷新文件列表(下文有),清除title字段。不管怎樣,都alert出返回的數(shù)據(jù)。
第三步,上傳文件
控制器部分
現(xiàn)在開始上傳文件了。我們的URL是這樣的 /uplaod/upload_file/,所以,我們在uoload的控制器里建立upload_file方法。
public function upload_file()
{
$status = "";
$msg = "";
$file_element_name = 'userfile';
if (empty($_POST['title']))
{
$status = "error";
$msg = "Please enter a title";
}
if ($status != "error")
{
$config['upload_path'] = './files/';
$config['allowed_types'] = 'gif|jpg|png|doc|txt';
$config['max_size'] = 1024 * 8;
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload($file_element_name))
{
$status = 'error';
$msg = $this->upload->display_errors('', '');
}
else
{
$data = $this->upload->data();
$file_id = $this->files_model->insert_file($data['file_name'], $_POST['title']);
if($file_id)
{
$status = "success";
$msg = "File successfully uploaded";
}
else
{
unlink($data['full_path']);
$status = "error";
$msg = "Something went wrong when saving the file, please try again.";
}
}
@unlink($_FILES[$file_element_name]);
}
echo json_encode(array('status' => $status, 'msg' => $msg));
}
我們對title字段做了個簡單的數(shù)據(jù)檢查,看看他是否為空。不為空就加載codeigniter的upload庫。這個類庫為我們處理了很多的數(shù)據(jù)驗(yàn)證。
接著,我們上傳文件了。如果成功我們保存title和file_name。然后我們刪除了臨時文件,最后,json方法返回了狀態(tài)和信息,來告訴我們結(jié)果。
模型部分
按大多數(shù)人的MVC模式理念,我們應(yīng)該在模型里處理數(shù)據(jù)庫交換。
建立files_model.php
class Files_Model extends CI_Model {
public function insert_file($filename, $title)
{
$data = array(
'filename' => $filename,
'title' => $title
);
$this->db->insert('files', $data);
return $this->db->insert_id();
}
}
保存上傳文件的文件夾
不要忘記在根目錄建立個files文件夾,并給他寫入權(quán)限。
第四步,文件列表
成功上傳后,我們需要更新文件列表,方便修改。
Javascript部分
打開site.js,在后面追加:
function refresh_files()
{
$.get('./upload/files/')
.success(function (data){
$('#files').html(data);
});
}
Jquery的簡單應(yīng)用。Ajax取得指定url的內(nèi)容,填充到#files的div里。
控制器部分
不多說了。
public function files()
{
$files = $this->files_model->get_files();
$this->load->view('files', array('files' => $files));
}
調(diào)用模型的方法取得數(shù)據(jù),再加載到files視圖里顯示。
模型部分
public function get_files()
{
return $this->db->select()
->from('files')
->get()
->result();
}
視圖部分
新建files.php視圖
<?php
if (isset($files) && count($files))
{
?>
<?php
foreach ($files as $file)
{
?>
Delete
<?php echo $file->title?>
<?php echo $file->filename?>
<?php
}
?>
<?php
}
else
{
?>
No Files Uploaded
<?php
}
?>
刪除文件
Javascript部分
$('.delete_file_link').live('click', function(e) {
e.preventDefault();
if (confirm('Are you sure you want to delete this file?'))
{
var link = $(this);
$.ajax({
url : './upload/delete_file/' + link.data('file_id'),
dataType : 'json',
success : function (data)
{
files = $(#files);
if (data.status === "success")
{
link.parents('li').fadeOut('fast', function() {
$(this).remove();
if (files.find('li').length == 0)
{
files.html('<p>No Files Uploaded</p>');
}
});
}
else
{
alert(data.msg);
}
}
});
}
});
控制器部分
public function delete_file($file_id)
{
if ($this->files_model->delete_file($file_id))
{
$status = 'success';
$msg = 'File successfully deleted';
}
else
{
$status = 'error';
$msg = 'Something went wrong when deleteing the file, please try again';
}
echo json_encode(array('status' => $status, 'msg' => $msg));
}
模型部分
public function delete_file($file_id)
{
$file = $this->get_file($file_id);
if (!$this->db->where('id', $file_id)->delete('files'))
{
return FALSE;
}
unlink('./files/' . $file->filename);
return TRUE;
}
public function get_file($file_id)
{
return $this->db->select()
->from('files')
->where('id', $file_id)
->get()
->row();
}
嗯,簡單的應(yīng)用。沒有涉及的權(quán)限、上傳的進(jìn)度條等。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- php+ajax實(shí)現(xiàn)無刷新文件上傳功能(ajaxuploadfile)
- PHP中ajax無刷新上傳圖片與圖片下載功能
- PHP+JavaScript實(shí)現(xiàn)無刷新上傳圖片
- PHP+Ajax無刷新帶進(jìn)度條圖片上傳示例
- php+ajax無刷新上傳圖片的實(shí)現(xiàn)方法
- PHP Ajax實(shí)現(xiàn)無刷新附件上傳
- php+ajax無刷新上傳圖片實(shí)例代碼
- 使用PHP和HTML5 FormData實(shí)現(xiàn)無刷新文件上傳教程
- php利用iframe實(shí)現(xiàn)無刷新文件上傳功能的代碼
- PHP無刷新上傳文件實(shí)現(xiàn)代碼
- php ajax無刷新上傳圖片實(shí)例代碼
相關(guān)文章
圖文詳解laravel多對多關(guān)聯(lián)模型
多對多就相當(dāng)于一個專題Topic有多個文章,但是這多個文章又屬于多個專題,下面這篇文章主要給大家介紹了關(guān)于laravel多對多關(guān)聯(lián)模型的相關(guān)資料,需要的朋友可以參考下2021-08-08
Laravel validate error處理,ajax,json示例
今天小編就為大家分享一篇Laravel validate error處理,ajax,json示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
淺談PHP解析URL函數(shù)parse_url和parse_str
這篇文章主要介紹了PHP解析URL函數(shù)parse_url和parse_str,并給出了相應(yīng)的示例,非常的實(shí)用,有需要的朋友們可以參考下2014-11-11
PHP生成json和xml類型接口數(shù)據(jù)格式
在做數(shù)據(jù)接口時,我們通常要獲取第三方數(shù)據(jù)接口或者給第三方提供數(shù)據(jù)接口,而這些數(shù)據(jù)格式通常是以XML或者JSON格式傳輸,本文將介紹如何使用PHP生成XML格式數(shù)據(jù)供第三方調(diào)用以及如何獲取第三方提供的XML數(shù)據(jù)。2015-05-05
PHP轉(zhuǎn)換Excel中日期和時間類型的處理問題
在實(shí)際應(yīng)用中PHP讀取的Excel文件的日期無法直接使用,會出現(xiàn)的一系列問題,本文給大家介紹PHP轉(zhuǎn)換Excel中日期和時間類型的處理問題,感興趣的朋友一起看看吧2023-10-10
php靜態(tài)成員方法和靜態(tài)的成員屬性的使用方法
這篇文章主要介紹了php靜態(tài)成員方法和靜態(tài)的成員屬性的使用方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家使用的時候注意方法,需要的朋友可以參考下2017-10-10
php實(shí)現(xiàn)12306余票查詢、價格查詢示例
這篇文章主要介紹了php實(shí)現(xiàn)12306余票查詢、價格查詢示例的相關(guān)資料2014-04-04
jQuery Mobile + PHP實(shí)現(xiàn)文件上傳
這篇文章主要介紹了jQuery Mobile + PHP實(shí)現(xiàn)文件上傳的方法實(shí)例,以及由于自己疏忽造成的問題的解決方法,這里推薦給大家,有需要的小伙伴參考下2014-12-12

