当前位置:   article > 正文

PHP(9):将上传的Word文件保存到MS SQL Server数据库_上传word文件到数据库

上传word文件到数据库

  算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中。

  第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,这就有点尴尬了,怎么可能?!对于PHP,我还是个新手。

  没有办法,只能硬着头皮干了,星期一开始。

  原先我一直以为CSDN是最好的开发文档集散地,查资料是首选,结果我查了无数的资料,都没有找到相关的内容,快崩溃了。我发现很多记录日志真是糟糕,写开发日志是为了方便自己也方便别人,胡乱写有什么意义呢?!

  只能不停地试,总算是完成了这个小功能。

  完成界面:

   前端的页面文件:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>layui</title>
  6. <meta name="renderer" content="webkit">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <link rel="stylesheet" href="lib/layui-v2.6.3/css/layui.css" media="all">
  10. <link rel="stylesheet" href="css/public.css" media="all">
  11. <style>
  12. body {
  13. background-color: #ffffff;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div class="layui-form layuimini-form">
  19. <form action="" class="layui-form login-bottom" id="uploadFile">
  20. <div class="layui-form-item">
  21. <label class="layui-form-label required">模板文件名</label>
  22. <div class="layui-input-block">
  23. <input type="text" name="Dc01" id="Dc01" lay-verify="required" lay-reqtext="模板文件名称" value="" class="layui-input">
  24. </div>
  25. </div>
  26. <div class="layui-form-item">
  27. <label class="layui-form-label required">简要说明</label>
  28. <div class="layui-input-block">
  29. <input type="text" name="Dc04" id="Dc04" value="" class="layui-input">
  30. </div>
  31. </div>
  32. <div class="layui-form-item" style="border: 0px solid #d70008;">
  33. <label class="layui-form-label required">Word模板</label>
  34. <div class="layui-input-inline" style="width: 600px;">
  35. <input type="text" name="Dc05" id="Dc05" value="" style="width: 400px;" class="layui-input" disabled="disabled">
  36. </div>
  37. <div class="layui-input-inline" style="left: -200px;width: 120px;height: 32px;">
  38. <!-- <input type="button" value="选择Word文件" id="selectWord" style="width: 120px;height: 32px;"/> -->
  39. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" style="width: 100px;height: 39px;" id="selectWord">选择Word文件</button>
  40. <input type='file' id='readFile' style="opacity: 0;border: 0px solid #1e9fff;">
  41. </div>
  42. </div>
  43. <div class="layui-form-item">
  44. <label class="layui-form-label">项目名称</label>
  45. <div class="layui-input-block">
  46. <input type="text" name="Dc06" id="Dc06" value="" class="layui-input">
  47. </div>
  48. </div>
  49. <div class="layui-form-item">
  50. <label class="layui-form-label">子项目名称</label>
  51. <div class="layui-input-block">
  52. <input type="text" name="Dc07" id="Dc07" value="" class="layui-input">
  53. </div>
  54. </div>
  55. <div class="layui-form-item">
  56. <label class="layui-form-label">项目属性</label>
  57. <div class="layui-input-inline">
  58. <select id="Dc08" name="Dc08" lay-filter="outUnitList">
  59. <option value="日常维护">服务</option>
  60. <option value="定期巡检">物质采购</option>
  61. <option value="数据处理">工程</option>
  62. </select>
  63. </div>
  64. <label class="layui-form-label">适用年度</label>
  65. <div class="layui-input-inline">
  66. <input type="text" name="Dc09" id="Dc09" value="" class="layui-input">
  67. </div>
  68. </div>
  69. <div class="layui-form-item">
  70. <label class="layui-form-label">上传人</label>
  71. <div class="layui-input-inline">
  72. <input type="text" name="Dc02" id="Dc02" value="" class="layui-input">
  73. </div>
  74. <label class="layui-form-label">上传时间</label>
  75. <div class="layui-input-inline">
  76. <input type="text" name="Dc03" id="Dc03" value="" class="layui-input">
  77. </div>
  78. </div>
  79. <div class="layui-form-item">
  80. <div class="layui-input-block">
  81. <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
  82. </div>
  83. </div>
  84. </form>
  85. </div>
  86. <script src="lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
  87. <script>
  88. layui.use(['layer','form','rate'], function () {
  89. var form = layui.form, layer = layui.layer, $ = layui.$;
  90. let currentUser='';
  91. let currentDatetime='';
  92. //得到当前的用户名称
  93. $.ajax({
  94. url:'ZTBgetCurrentUser.php',
  95. type:'POST',
  96. async:false,
  97. success:function (data) {
  98. // $("input[name=C02]").val(data);
  99. document.getElementById('Dc02').value=data;
  100. currentUser=data;
  101. }
  102. });
  103. //得到当前服务器的时间
  104. $.ajax({
  105. url:'ZTBgetServerDatetime.php',
  106. type:'POST',
  107. async:false,
  108. success:function (data) {
  109. // $("input[name=C02]").val(data);
  110. document.getElementById('Dc03').value=data;
  111. document.getElementById('Dc09').value=data.substring(0,4);
  112. currentDatetime=data;
  113. }
  114. });
  115. document.getElementById('selectWord').addEventListener('click',function(){
  116. $("#readFile").trigger("click");
  117. });
  118. document.getElementById('readFile').addEventListener('change',function(){
  119. if(this.files.length===0){
  120. console.log('没有选择文件!');
  121. return;
  122. }
  123. let reader=new FileReader();
  124. reader.onload=function (){
  125. console.log(reader.result);
  126. }
  127. // reader.readAsText(this.files[0]);
  128. // console.log(this.files[0].size);
  129. // console.log(this.files[0].name);
  130. // document.getElementById('Dc05').
  131. document.getElementById('Dc05').value=this.files[0].name;
  132. // console.log(this.files[0].type);
  133. })
  134. // localStorage.clear();
  135. //监听提交
  136. form.on('submit(saveBtn)', function (data) {
  137. data = data.field;
  138. //检查数据
  139. var canContinue=true;
  140. var strFalse="";
  141. var jsonData=[];//准备一个空数组
  142. var updateData=new Object();//准备对象
  143. updateData.strTable="HtTemplateFile";
  144. updateData.strWhere="c01='"+document.getElementById("Dc01").value+"' and c08='"+document.getElementById("Dc08").value+"' and c09='"+document.getElementById("Dc09").value+"'";
  145. // console.log(updateData);
  146. jsonData.push(updateData);
  147. var json_str=JSON.stringify(jsonData);
  148. $.ajax({//检查数据库ID是否存在
  149. url:'ZTBIsExist.php',
  150. data:json_str,
  151. type:'POST',
  152. datetype:'json',
  153. async:false,
  154. success:function (data) {
  155. if(data=='YES'){
  156. canContinue=false;
  157. strFalse="要插入的记录重复!";
  158. }
  159. }
  160. });
  161. if(canContinue){
  162. // let formID = document.getElementById("uploadFile");
  163. // let formData = new FormData(formID);//FormData构造器接收的是一个form的DOM对象
  164. let wordFile = document.getElementById('readFile');
  165. //用FormData对象对表单数据进行封装
  166. const fd = new FormData();//FormData构造器接收的是一个form的DOM对象
  167. fd.append("wordFile",wordFile.files[0]);//Word文件数据
  168. fd.append("c01",$('#Dc01').val());//模板文件名
  169. fd.append("c02",currentUser);//上传人
  170. fd.append("c03",currentDatetime);//上传时间
  171. fd.append("c04",$('#Dc04').val());//简要说明
  172. fd.append("c06",$('#Dc06').val());//项目名称
  173. fd.append("c07",$('#Dc07').val());//子项目名称
  174. fd.append("c08",$('#Dc08').val());//项目类型
  175. fd.append("c09",$('#Dc09').val());//适用年度
  176. $.ajax({
  177. url: 'ZTBHTTemplateFileAdd.php',
  178. type: "POST",
  179. data: fd,
  180. dataType: "JSON",
  181. async: true,
  182. processData: false,//设置为false,JQuery则不对数据进行序列化
  183. contentType: false,//设置为false,JQuery则不设Content-Type请求头
  184. beforeSend: function(xhr){
  185. console.log('开始!');
  186. },
  187. complete: function(xhr,status){
  188. console.log('完成!');
  189. },
  190. error: function(xhr,status,error){
  191. console.log('请求出错!');
  192. },
  193. success: function(result){
  194. console.log('表单提交成功!');
  195. }
  196. });
  197. return false;//阻止表单的默认提交事件
  198. }
  199. });
  200. });
  201. </script>
  202. </body>
  203. </html>

  后台PHP文件:

  1. <?php
  2. // error_reporting(0);
  3. session_start();
  4. $continue=true;
  5. $falseStr="";
  6. //获取post的数据
  7. $C01 = $_POST['c01'];
  8. $C02 = $_POST['c02'];
  9. $C03 = $_POST['c03'];
  10. $C04 = $_POST['c04'];
  11. $C06 = $_POST['c06'];
  12. $C07 = $_POST['c07'];
  13. $C08 = $_POST['c08'];
  14. $C09 = $_POST['c09'];
  15. if(!isset($_FILES)){
  16. $returnArr['c05']='没有选择上传的文件';
  17. }else{
  18. $returnArr['c05']='有文件';
  19. }
  20. if($_FILES['wordFile']['error']>0){
  21. $returnArr['c05']='文件有错误';
  22. }
  23. $uploadFile = $_FILES["wordFile"];//得到上传的文件
  24. $wordBlob=file_get_contents($uploadFile['tmp_name']);
  25. file_put_contents("123.docx",$wordBlob , FILE_APPEND);//将文件内容写到磁盘上
  26. //将内容字符串转为十六进制字符串
  27. $wordHexData = "0x".bin2hex($wordBlob);
  28. $returnArr['c01']=$C01;
  29. $returnArr['c02']=$C02;
  30. $returnArr['c03']=$C03;
  31. $returnArr['c04']=$C04;
  32. $returnArr['c06']=$C06;
  33. $returnArr['c07']=$C07;
  34. $returnArr['c08']=$C08;
  35. $returnArr['c09']=$C09;
  36. //准备写入数据库
  37. require 'ZTBLinkConfig.php';
  38. //准备插入数据
  39. $sql = "insert into HtTemplateFile(c01,c02,c03,c04,c06,c07,c08,c09,c05) values('$C01','$C02','$C03','$C04','$C06','$C07','$C08','$C09',$wordHexData)";
  40. $result =$ZTBConn->query($sql);
  41. $returnArr['c05']=$result;
  42. //读出来写到磁盘上,这样可以判断上传文件是否真的写入了。
  43. // $sql = "select * from HtTemplateFile where c01='模板文件名' and c08='项目属性' and c09='2021'";
  44. // $result =$ZTBConn->query($sql);
  45. // while($row=$result->fetch()){
  46. // $hexData= $row['c05'];
  47. // }
  48. // $binData=hex2bin($hexData);
  49. // file_put_contents("333.docx",$hexData , FILE_APPEND);//将文件内容写到磁盘上
  50. echo json_encode($returnArr,JSON_UNESCAPED_UNICODE);
  51. ?>

  注意点:

  1、美化上传按钮

  普通的文件上传按钮不好看,与整个界面不协调,放上一个DIV后再放一个LayUI的按钮就可以了,然后使用事件代理,触发实际文件的上传,是change事件。

  1. document.getElementById('selectWord').addEventListener('click',function(){
  2. $("#readFile").trigger("click");
  3. });

  2、封装上传的数据

  使用formData,可以封装整个form。

  1. let formID = document.getElementById("uploadFile");
  2. let formData = new FormData(formID);//FormData构造器接收的是一个form的DOM对象

  也可以按照要求逐个添加。

  1. let wordFile = document.getElementById('readFile');
  2. //用FormData对象对表单数据进行封装
  3. const fd = new FormData();//FormData构造器接收的是一个form的DOM对象
  4. fd.append("wordFile",wordFile.files[0]);//Word文件数据
  5. fd.append("c01",$('#Dc01').val());//模板文件名
  6. fd.append("c02",currentUser);//上传人
  7. fd.append("c03",currentDatetime);//上传时间
  8. fd.append("c04",$('#Dc04').val());//简要说明
  9. fd.append("c06",$('#Dc06').val());//项目名称
  10. fd.append("c07",$('#Dc07').val());//子项目名称
  11. fd.append("c08",$('#Dc08').val());//项目类型
  12. fd.append("c09",$('#Dc09').val());//适用年度

  既然是对象,最好使用const定义。

  完整的上传,使用ajax。

  1. $.ajax({
  2. url: 'ZTBHTTemplateFileAdd.php',
  3. type: "POST",
  4. data: fd,
  5. dataType: "JSON",
  6. async: true,
  7. processData: false,//设置为false,JQuery则不对数据进行序列化
  8. contentType: false,//设置为false,JQuery则不设Content-Type请求头
  9. beforeSend: function(xhr){
  10. console.log('开始!');
  11. },
  12. complete: function(xhr,status){
  13. console.log('完成!');
  14. },
  15. error: function(xhr,status,error){
  16. console.log('请求出错!');
  17. },
  18. success: function(result){
  19. console.log('表单提交成功!');
  20. }
  21. });
  22. return false;//阻止表单的默认提交事件
  23. }

  注意,返回值一定要是JSON格式!!!

  3、接收上传的数据,我为了检查数据,是生成在磁盘上,这样就好判断上传的结果,保存到数据库后也是先取出来再写到磁盘上来判断。

  保存的时候需要将数据转成16进制的,读取出来就不用再转了!

  写入数据库前写入磁盘:

  1. $uploadFile = $_FILES["wordFile"];//得到上传的文件
  2. $wordBlob=file_get_contents($uploadFile['tmp_name']);
  3. file_put_contents("123.docx",$wordBlob , FILE_APPEND);//将文件内容写到磁盘上
  4. //将内容字符串转为十六进制字符串
  5. $wordHexData = "0x".bin2hex($wordBlob);

  从数据库中读出来再写入磁盘:

  1. //读出来写到磁盘上,这样可以判断上传文件是否真的写入了。
  2. $sql = "select * from HtTemplateFile where c01='模板文件名' and c08='项目属性' and c09='2021'";
  3. $result =$ZTBConn->query($sql);
  4. while($row=$result->fetch()){
  5. $hexData= $row['c05'];
  6. }
  7. file_put_contents("333.docx",$hexData , FILE_APPEND);//将文件内容写到磁盘上

  MS SQL Server 2014的文件字段为image。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/391341
推荐阅读
相关标签
  

闽ICP备14008679号