算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中。
第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,这就有点尴尬了,怎么可能?!对于PHP,我还是个新手。
没有办法,只能硬着头皮干了,星期一开始。
原先我一直以为CSDN是最好的开发文档集散地,查资料是首选,结果我查了无数的资料,都没有找到相关的内容,快崩溃了。我发现很多记录日志真是糟糕,写开发日志是为了方便自己也方便别人,胡乱写有什么意义呢?!
只能不停地试,总算是完成了这个小功能。
完成界面:
前端的页面文件:
layui
body {
background-color: #ffffff;
}
模板文件名
简要说明
Word模板
选择Word文件
项目名称
子项目名称
项目属性
服务
物质采购
工程
适用年度
上传人
上传时间
确认保存
layui.use(['layer','form','rate'], function () {
var form = layui.form, layer = layui.layer, $ = layui.$;
let currentUser='';
let currentDatetime='';
//得到当前的用户名称
$.ajax({
url:'ZTBgetCurrentUser.php',
type:'POST',
async:false,
success:function (data) {
// $("input[name=C02]").val(data);
document.getElementById('Dc02').value=data;
currentUser=data;
}
});
//得到当前服务器的时间
$.ajax({
url:'ZTBgetServerDatetime.php',
type:'POST',
async:false,
success:function (data) {
// $("input[name=C02]").val(data);
document.getElementById('Dc03').value=data;
document.getElementById('Dc09').value=data.substring(0,4);
currentDatetime=data;
}
});
document.getElementById('selectWord').addEventListener('click',function(){
$("#readFile").trigger("click");
});
document.getElementById('readFile').addEventListener('change',function(){
if(this.files.length===0){
console.log('没有选择文件!');
return;
}
let reader=new FileReader();
reader.onload=function (){
console.log(reader.result);
}
// reader.readAsText(this.files[0]);
// console.log(this.files[0].size);
// console.log(this.files[0].name);
// document.getElementById('Dc05').
document.getElementById('Dc05').value=this.files[0].name;
// console.log(this.files[0].type);
})
// localStorage.clear();
//监听提交
form.on('submit(saveBtn)', function (data) {
data = data.field;
//检查数据
var canContinue=true;
var strFalse="";
var jsonData=[];//准备一个空数组
var updateData=new Object();//准备对象
updateData.strTable="HtTemplateFile";
updateData.strWhere="c01='"+document.getElementById("Dc01").value+"' and c08='"+document.getElementById("Dc08").value+"' and c09='"+document.getElementById("Dc09").value+"'";
// console.log(updateData);
jsonData.push(updateData);
var json_str=JSON.stringify(jsonData);
$.ajax({//检查数据库ID是否存在
url:'ZTBIsExist.php',
data:json_str,
type:'POST',
datetype:'json',
async:false,
success:function (data) {
if(data=='YES'){
canContinue=false;
strFalse="要插入的记录重复!";
}
}
});
if(canContinue){
// let formID = document.getElementById("uploadFile");
// let formData = new FormData(formID);//FormData构造器接收的是一个form的DOM对象
let wordFile = document.getElementById('readFile');
//用FormData对象对表单数据进行封装
const fd = new FormData();//FormData构造器接收的是一个form的DOM对象
fd.append("wordFile",wordFile.files[0]);//Word文件数据
fd.append("c01",$('#Dc01').val());//模板文件名
fd.append("c02",currentUser);//上传人
fd.append("c03",currentDatetime);//上传时间
fd.append("c04",$('#Dc04').val());//简要说明
fd.append("c06",$('#Dc06').val());//项目名称
fd.append("c07",$('#Dc07').val());//子项目名称
fd.append("c08",$('#Dc08').val());//项目类型
fd.append("c09",$('#Dc09').val());//适用年度
$.ajax({
url: 'ZTBHTTemplateFileAdd.php',
type: "POST",
data: fd,
dataType: "JSON",
async: true,
processData: false,//设置为false,JQuery则不对数据进行序列化
contentType: false,//设置为false,JQuery则不设Content-Type请求头
beforeSend: function(xhr){
console.log('开始!');
},
complete: function(xhr,status){
console.log('完成!');
},
error: function(xhr,status,error){
console.log('请求出错!');
},
success: function(result){
console.log('表单提交成功!');
}
});
return false;//阻止表单的默认提交事件
}
});
});
后台PHP文件:
注意点:
1、美化上传按钮
普通的文件上传按钮不好看,与整个界面不协调,放上一个DIV后再放一个LayUI的按钮就可以了,然后使用事件代理,触发实际文件的上传,是change事件。
document.getElementById('selectWord').addEventListener('click',function(){
$("#readFile").trigger("click");
});
2、封装上传的数据
使用formData,可以封装整个form。
let formID = document.getElementById("uploadFile");
let formData = new FormData(formID);//FormData构造器接收的是一个form的DOM对象
也可以按照要求逐个添加。
let wordFile = document.getElementById('readFile');
//用FormData对象对表单数据进行封装
const fd = new FormData();//FormData构造器接收的是一个form的DOM对象
fd.append("wordFile",wordFile.files[0]);//Word文件数据
fd.append("c01",$('#Dc01').val());//模板文件名
fd.append("c02",currentUser);//上传人
fd.append("c03",currentDatetime);//上传时间
fd.append("c04",$('#Dc04').val());//简要说明
fd.append("c06",$('#Dc06').val());//项目名称
fd.append("c07",$('#Dc07').val());//子项目名称
fd.append("c08",$('#Dc08').val());//项目类型
fd.append("c09",$('#Dc09').val());//适用年度
既然是对象,最好使用const定义。
完整的上传,使用ajax。
$.ajax({
url: 'ZTBHTTemplateFileAdd.php',
type: "POST",
data: fd,
dataType: "JSON",
async: true,
processData: false,//设置为false,JQuery则不对数据进行序列化
contentType: false,//设置为false,JQuery则不设Content-Type请求头
beforeSend: function(xhr){
console.log('开始!');
},
complete: function(xhr,status){
console.log('完成!');
},
error: function(xhr,status,error){
console.log('请求出错!');
},
success: function(result){
console.log('表单提交成功!');
}
});
return false;//阻止表单的默认提交事件
}
注意,返回值一定要是JSON格式!!!
3、接收上传的数据,我为了检查数据,是生成在磁盘上,这样就好判断上传的结果,保存到数据库后也是先取出来再写到磁盘上来判断。
保存的时候需要将数据转成16进制的,读取出来就不用再转了!
写入数据库前写入磁盘:
$uploadFile = $_FILES["wordFile"];//得到上传的文件
$wordBlob=file_get_contents($uploadFile['tmp_name']);
file_put_contents("123.docx",$wordBlob , FILE_APPEND);//将文件内容写到磁盘上
//将内容字符串转为十六进制字符串
$wordHexData = "0x".bin2hex($wordBlob);
从数据库中读出来再写入磁盘:
//读出来写到磁盘上,这样可以判断上传文件是否真的写入了。
$sql = "select * from HtTemplateFile where c01='模板文件名' and c08='项目属性' and c09='2021'";
$result =$ZTBConn->query($sql);
while($row=$result->fetch()){
$hexData= $row['c05'];
}
file_put_contents("333.docx",$hexData , FILE_APPEND);//将文件内容写到磁盘上
MS SQL Server 2014的文件字段为image。