<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
算起來,折騰了整整一天,就是完成將上傳的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。
到此這篇關於PHP實現將Word檔案儲存到SQL Server資料庫的文章就介紹到這了,更多相關PHP Word儲存資料庫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45