您当前的位置: 首页 >  sql

dawn

暂无认证

  • 7浏览

    0关注

    204博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

dawn 发布时间:2022-02-25 18:50:39 ,浏览量:7

  算起来,折腾了整整一天,就是完成将上传的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。

关注
打赏
1664252102
查看更多评论
立即登录/注册

微信扫码登录

0.3224s