jQuery easyui-filebox+ajax+PHP實現檔案上傳並恢復備份
阿新 • • 發佈:2019-02-07
最近開發一個數據備份恢復的功能,該專案基於PHP+Mysql+Apache的架構,因此這個功能用easyui-filebox+ajax+PHP實現。
1.首先HTML部分:
<form id="importFileForm" method="post" enctype="multipart/form-data">
<div style="margin-bottom:20px">
<div>選擇Tar包:</div>
<input id="fileupload" class="easyui-filebox" name="mypic" data-options="prompt:'Choose file...'"
style="width:100%">
</div>
<div>
<a href="#" class="easyui-linkbutton" onclick="importFileAndRestore()"
style="width:100%">RestoreBackup</a >
</div>
<div><label id="fileName"></label></div>
<div><label id="uploadInfo"></label></div>
</form>
2.js部分:
//上傳並恢復備份
function importFileAndRestore() {
//獲取上傳檔案控制元件內容。根據實際情況,easyui-filebox把DOC打亂了,生成filebox_file_id_X這個id標記要上傳的檔案,此控制元件可以上傳多個檔案,因此一個file,X值為1;兩個X值為1,2;以此類推;
var file = document.getElementById('filebox_file_id_1').files[0];
//判斷控制元件中是否存在檔案內容,如果不存在,彈出提示資訊,阻止進一步操作
if (file == null) {
alert('錯誤,請選擇檔案');
return;
}
//獲取檔名稱
var fileName = file.name;
//獲取檔案型別名稱
var file_typename = fileName.substring(fileName.lastIndexOf('.'), fileName.length);
//這裡限定上傳檔案檔案型別必須為.gz,如果檔案型別不符,提示錯誤資訊
if (file_typename == '.gz') {
//計算檔案大小
var fileSize = 0;
//如果檔案大小大於1024位元組X1024位元組,則顯示檔案大小單位為MB,否則為KB
if (file.size > 1024 * 1024) {
fileSize = Math.round(file.size * 100 / (1024 * 1024)) / 100;
if (fileSize > 100) {
alert('錯誤,檔案超過100MB,禁止上傳!');
return;
}
fileSize = fileSize.toString() + 'MB';
}
else {
fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
}
//獲取form資料
var formData = new FormData($("#importFileForm")[0]);
//將form資料傳遞給後臺處理。contentType必須設定為false,否則chrome和firefox不相容
$.ajax({
url: '../../php/upload_backup.php',
type: 'POST',
data: formData,
dataType: 'json',
async: false,
cache: false,
contentType:
,
processData: false,
success: function (data) {
//上傳成功後將控制元件內容清空,並顯示上傳成功資訊
document.getElementById('fileupload').value = null;
if (parseInt(data) == 0) {
alert("你選擇的檔案格式不正確!");
$('#upload_win').window('close');
} else if (parseInt(data) == 1) {
alert("檔案上傳失敗!");
$('#upload_win').window('close');
} else {
for (var p in data) {
for (var pp in data[p]) {
var table_name = (pp.split('.'))[0];
//先清空要恢復的表
var clear_table = {
action: "clear" + table_name
};
$.ajax({
url: '../../php/client.php',
type: "POST",
dataType: 'json',
data: {
strRequest: JSON.stringify(clear_table)
},
success: function (obj) {
}
})
//恢復備份
var restore_table = {
action: "add" + table_name,
data: JSON.parse(data[p][pp])
};
$.ajax({
url: '../../php/client.php',
type: "POST",
dataType: 'json',
data: {
strRequest: JSON.stringify(restore_table)
},
success: function (obj) {
}
})
}
}
alert("恢復備份成功!");
$('#upload_win').window('close');
}
},
error: function (returnInfo) {
//上傳失敗時顯示上傳失敗資訊
document.getElementById('uploadInfo').innerHTML = "<span style='color:Red'>" + returnInfo + "</span>";
}
});
}
else {
//將錯誤資訊顯示在前端label文字中
document.getElementById('fileName').innerHTML = "<span style='color:Red'>錯誤提示:上傳檔案應該是.tar.gz字尾而不應該是" + file_typename + ",請重新選擇檔案</span>"
}
}
3.PHP部分:
<?php
//通過$_FILES讀取easyui-filebox控制元件的檔名
$picname = $_FILES['mypic']['name'];
if ($picname != "") {
//檔案格式可以在js裡判斷,也可以在PHP中判斷;
//$type = strstr($picname, '.'); //限制上傳格式
//if ($type != ".tar.gz") {
// echo 0; //0代表檔案格式不對;
// exit;
//}
//上傳路徑
$pic_path = "/var/www/html/upload/". $picname;
if(move_uploaded_file($_FILES['mypic']['tmp_name'], $pic_path)){//返回值1,代表檔案上傳成功;
//解壓檔案
shell_exec('cd /var/www/html/upload;tar zxvf '.$picname);
$files_josn=shell_exec("cd /var/www/html/upload/backup;ls *.json");
$files_nameArray=array();
$token = strtok($files_josn, "\n");
while ($token != false)
{
array_push($files_nameArray, $token);
$token = strtok("\n");
}
//讀取備份的內容
$contents=array();
for($i=0;$i<count($files_nameArray);$i++){
$temp=$files_nameArray[$i];
$content=array();
$content[$temp]=file_get_contents("/var/www/html/upload/backup/".$files_nameArray[$i]);
array_push($contents,$content);
}
echo json_encode($contents);
}else{
echo 1;//1代表檔案上傳失敗
}
}
?>