算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中。
第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,这就有点尴尬了,怎么可能?!对于PHP,我还是个新手。
没有办法,只能硬着头皮干了,星期一开始。
原先我一直以为CSDN是最好的开发文档集散地,查资料是首选,结果我查了无数的资料,都没有找到相关的内容,快崩溃了。我发现很多记录日志真是糟糕,写开发日志是为了方便自己也方便别人,胡乱写有什么意义呢?!
只能不停地试,总算是完成了这个小功能。
完成界面:
前端的页面文件:
<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <title>layui</title> <meta name=\"renderer\" content=\"webkit\"> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\"> <link rel=\"stylesheet\" href=\"lib/layui-v2.6.3/css/layui.css\" rel=\"external nofollow\" media=\"all\"> <link rel=\"stylesheet\" href=\"css/public.css\" rel=\"external nofollow\" media=\"all\"> <style> body { background-color: #ffffff; } </style> </head> <body> <div class=\"layui-form layuimini-form\"> <form action=\"\" class=\"layui-form login-bottom\" id=\"uploadFile\"> <div class=\"layui-form-item\"> <label class=\"layui-form-label required\">模板文件名</label> <div class=\"layui-input-block\"> <input type=\"text\" name=\"Dc01\" id=\"Dc01\" lay-verify=\"required\" lay-reqtext=\"模板文件名称\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\"> <label class=\"layui-form-label required\">简要说明</label> <div class=\"layui-input-block\"> <input type=\"text\" name=\"Dc04\" id=\"Dc04\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\" style=\"border: 0px solid #d70008;\"> <label class=\"layui-form-label required\">Word模板</label> <div class=\"layui-input-inline\" style=\"width: 600px;\"> <input type=\"text\" name=\"Dc05\" id=\"Dc05\" value=\"\" style=\"width: 400px;\" class=\"layui-input\" disabled=\"disabled\"> </div> <div class=\"layui-input-inline\" style=\"left: -200px;width: 120px;height: 32px;\"> <!-- <input type=\"button\" value=\"选择Word文件\" id=\"selectWord\" style=\"width: 120px;height: 32px;\"/> --> <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-normal\" style=\"width: 100px;height: 39px;\" id=\"selectWord\">选择Word文件</button> <input type=\'file\' id=\'readFile\' style=\"opacity: 0;border: 0px solid #1e9fff;\"> </div> </div> <div class=\"layui-form-item\"> <label class=\"layui-form-label\">项目名称</label> <div class=\"layui-input-block\"> <input type=\"text\" name=\"Dc06\" id=\"Dc06\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\"> <label class=\"layui-form-label\">子项目名称</label> <div class=\"layui-input-block\"> <input type=\"text\" name=\"Dc07\" id=\"Dc07\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\"> <label class=\"layui-form-label\">项目属性</label> <div class=\"layui-input-inline\"> <select id=\"Dc08\" name=\"Dc08\" lay-filter=\"outUnitList\"> <option value=\"日常维护\">服务</option> <option value=\"定期巡检\">物质采购</option> <option value=\"数据处理\">工程</option> </select> </div> <label class=\"layui-form-label\">适用年度</label> <div class=\"layui-input-inline\"> <input type=\"text\" name=\"Dc09\" id=\"Dc09\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\"> <label class=\"layui-form-label\">上传人</label> <div class=\"layui-input-inline\"> <input type=\"text\" name=\"Dc02\" id=\"Dc02\" value=\"\" class=\"layui-input\"> </div> <label class=\"layui-form-label\">上传时间</label> <div class=\"layui-input-inline\"> <input type=\"text\" name=\"Dc03\" id=\"Dc03\" value=\"\" class=\"layui-input\"> </div> </div> <div class=\"layui-form-item\"> <div class=\"layui-input-block\"> <button class=\"layui-btn layui-btn-normal\" lay-submit lay-filter=\"saveBtn\">确认保存</button> </div> </div> </form> </div> <script src=\"lib/layui-v2.6.3/layui.js\" charset=\"utf-8\"></script> <script> 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;//阻止表单的默认提交事件 } }); }); </script> </body> </html>
后台PHP文件:
<?php // error_reporting(0); session_start(); $continue=true; $falseStr=\"\"; //获取post的数据 $C01 = $_POST[\'c01\']; $C02 = $_POST[\'c02\']; $C03 = $_POST[\'c03\']; $C04 = $_POST[\'c04\']; $C06 = $_POST[\'c06\']; $C07 = $_POST[\'c07\']; $C08 = $_POST[\'c08\']; $C09 = $_POST[\'c09\']; if(!isset($_FILES)){ $returnArr[\'c05\']=\'没有选择上传的文件\'; }else{ $returnArr[\'c05\']=\'有文件\'; } if($_FILES[\'wordFile\'][\'error\']>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。
© 版权声明
THE END
暂无评论内容