算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中。
第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,这就有点尴尬了,怎么可能?!对于PHP,我还是个新手。
没有办法,只能硬着头皮干了,星期一开始。
原先我一直以为CSDN是最好的开发文档集散地,查资料是首选,结果我查了无数的资料,都没有找到相关的内容,快崩溃了。我发现很多记录日志真是糟糕,写开发日志是为了方便自己也方便别人,胡乱写有什么意义呢?!
只能不停地试,总算是完成了这个小功能。
完成界面:
前端的页面文件:
layui
后台PHP文件:
0){ $returnArr['c05']='文件有错误'; } $uploadFile = $_FILES["wordFile"];//得到上传的文件 $wordBlob=file_get_contents($uploadFile['tmp_name']); file_put_contents("123.docx",$wordBlob , FILE_APPEND);//将文件内容写到磁盘上 //将内容字符串转为十六进制字符串 $wordHexData = "0x".bin2hex($wordBlob); $returnArr['c01']=$C01; $returnArr['c02']=$C02; $returnArr['c03']=$C03; $returnArr['c04']=$C04; $returnArr['c06']=$C06; $returnArr['c07']=$C07; $returnArr['c08']=$C08; $returnArr['c09']=$C09; //准备写入数据库 require 'ZTBLinkConfig.php'; //准备插入数据 $sql = "insert into HtTemplateFile(c01,c02,c03,c04,c06,c07,c08,c09,c05) values('$C01','$C02','$C03','$C04','$C06','$C07','$C08','$C09',$wordHexData)"; $result =$ZTBConn->query($sql); $returnArr['c05']=$result; //读出来写到磁盘上,这样可以判断上传文件是否真的写入了。 // $sql = "select * from HtTemplateFile where c01='模板文件名' and c08='项目属性' and c09='2021'"; // $result =$ZTBConn->query($sql); // while($row=$result->fetch()){ // $hexData= $row['c05']; // } // $binData=hex2bin($hexData); // file_put_contents("333.docx",$hexData , FILE_APPEND);//将文件内容写到磁盘上 echo json_encode($returnArr,JSON_UNESCAPED_UNICODE); ?>
注意点:
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。
到此这篇关于PHP实现将Word文件保存到SQL Server数据库的文章就介绍到这了,更多相关PHP Word保存数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!