PHP实现将Word文件保存到SQL Server数据库

算起来,折腾了整整一天,就是完成将上传的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保存数据库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • php 备份数据库代码(生成word,excel,json,xml,sql)

    单表备份代码: 复制代码 代码如下: <?php    class Db    {        var $conn; function Db($host="localhost",$user="root",$pass="root",$db="test")        {          if(!$this->conn=mysql_connect($host,$user,$pass))          die(

  • php实现将HTML页面转换成word并且保存的方法

    本文实例讲述了php实现将HTML页面转换成word并且保存的方法.分享给大家供大家参考,具体如下: 这里用使用到一个PHP的工具叫:PHPWord. 生成Word的原理是,将堆规定好了的xml压缩成一个zip包,并且把后缀名改成doc或者docx即可. 所以使用PHPWord,需要你的PHP环境安装zip.dll压缩扩展,我写了一个demo. 功能说明: 20150507 - HTML中的<p>标签和<ol>列表标签的获取 20150508 - 新增获取文章中的图片功能 2015

  • PHP把网页保存为word文件的三种方法

    一.PHP生成word的两种思路或原理 1.利用windows下面的 com组件2.利用PHP将内容写入doc文件之中具体实现方法如下. 二.利用windows下面的com组件 原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成文档,PHP官方文档手册:http://www.php.net/manual/en/class.com.php 使用官方实例: 复制代码 代码如下: <?php// starting word$w

  • PHP替换Word中变量并导出PDF图片的实现方法

    在线生成合同信息,一个 word 文件里面有些信息需要通过数据库读取计算出并填写到 word 文档中最终显示在线 pdf 预览功能,接下来我交大家如果实现该需求 2.接下来实现如何替换文档内容 我们新建一个 aa.docx 的文档,里面放了一个变量信息 3.接下来使用 php 来替换这个变量信息 代码如下 ... use PhpOffice\PhpWord\TemplateProcessor; ... $path = storage_path('aa.docx'); // 生成world 存放目

  • php修改word的实例方法

    1.将word另存为网页. 2.修改为默认页面视图. 3.编写php代码. 4.通过fwrite等函数修改Word内容即可. 实例 ob_start();//开启缓存 print'';//输出头部 $content = file_get_contents (S_ROOT.'./temp/word/jzydt.htm');//取得模板内容 $content = str_replace('<{jzydt_company_name}>',"400电话",$content);//经

  • php将word转换为html格式代码分析

    PHP将上传word文件,转化为Html格式,(多种转换方式) 1.通过PHPOffice 1: composer require phpoffice/phpword /* 通过composer安装 PHPOffice 需要科学上网 或者用中国镜像:https://www.phpcomposer.com/ */ 2: 安装成功可看到 vendor文件夹 3: 使用方法 : require 'vendor/autoload.php'; $phpWord = \PhpOffice\PhpWord\I

  • PHP实现将Word文件保存到SQL Server数据库

    算起来,折腾了整整一天,就是完成将上传的Word文件保存到MS SQL Server 2014数据库中. 第一次使用PHP来开发一个小程序,压力也挺大,主要是用户觉得我很快就能完成,这就有点尴尬了,怎么可能?!对于PHP,我还是个新手. 没有办法,只能硬着头皮干了,星期一开始. 原先我一直以为CSDN是最好的开发文档集散地,查资料是首选,结果我查了无数的资料,都没有找到相关的内容,快崩溃了.我发现很多记录日志真是糟糕,写开发日志是为了方便自己也方便别人,胡乱写有什么意义呢?! 只能不停地试,总算

  • SQL Server 数据库的备份详细介绍及注意事项

    SQL Server 备份 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQL Server所有可用的备份还原功能,并尽可能用实例说话. 什么是备份?SQL Server基于Windows,以文件形式存放资料,所以备份就是Windows上SQL Server相关文件的一个某个时间点的副本.根据备份类型的不同,副本的种类和内

  • 详解SQL Server数据库状态和文件状态

    数据库状态 (database states) 查询数据库的当前状态 : 1.查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列 user master go select state_desc ,[name] from sys.databases go 2.查询指定数据库的状态,通过DATABASEPROPERTYEX函数的Status属性 select DATABASEPROPERTYEX('demoData','status') go 状态: ONLIN

  • 没有SQL Server数据库时如何打开.MDF文件

    如果您在试图打开一个.MDF数据库文件时,却发现自己没有安装SQL Server数据库,该怎么办呢?这时候,如果恰巧您的机子上装有Visual Studio 2005或者是更高的版本时,不用安装SQL Server数据库也能打开.MDF数据库文件.本文我们主要介绍了这一方法的实现,接下来我们就开始介绍. 解决方法: 打开Visual Studio 2005,在项目中点击工具→连接到数据库会出现更改数据源,选择, 点确定,会出现如下窗口: 浏览到你的mdf数据库文件: 点打开 然后点连接测试,如果

  • SQL server数据库创建代码 filegroup文件组修改的示例代码

    数据库的操作: 1. 对数据文件的操作(添加,删除,修改文件的初始大小,最大大小,步长) 2. 数据库文件的收缩 3. 数据库的只读/读写   read_only只读   read_write可读写   read_only表示只读  read_write表示可读可写 4. 数据库的限制访问(单用户,多用户,限制用户模式) 5.数据库脱机/联机    offline  脱机 alter database love set offline      online 联机    alter databa

  • Sql Server 数据库中调用dll文件的过程

    1.首先新建一个空的解决方案,并添加一个类库,代码如下,编译并生产dll using System; using System.Collections.Generic; using System.Data.SqlTypes; using System.Linq; using System.Text; namespace TEST { public class TestTrans { [Microsoft.SqlServer.Server.SqlFunction] public static Sq

  • 清除SQL Server数据库日志(ldf文件)的方法汇总

    目录 解决方案1 - 直接删除本地ldf日志文件:(比较靠谱方案!) 解决方案2 -收缩数据库日志文件(最靠谱方案!) 解决方案3 - 采用SQL脚本删除. 清除SQL Server数据库日志(ldf文件)的几种方法 随着系统运行时间的推移,数据库日志文件会变得越来越大,这时我们需要对日志文件进行备份或清理. 解决方案1 - 直接删除本地ldf日志文件:(比较靠谱方案!) 1. 在SQL管理器分离数据库. 2. 对数据库日志文件进行压缩备份(rar, zip) 3. 直接删除ldf文件. 附加数

  • Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法

    本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL.Oracle.SQL Server数据库. 其中包括以下几个软件的安装及配置: unixODBC FreeTDS pyodbc cx_Oracle 欢迎转载,请注明作者.出处. 作者:张正 QQ:176036317 如有疑问,欢迎联系. 本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL.Oracle.SQ

  • SQL Server数据库定时自动备份

    SQL Server 数据库定时自动备份,供大家参考,具体内容如下 在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库.要实现数据库的定时自动备份,最常用的方式就是使用SQL Server代理中的作业.启动SQL Server Agent服务,然后在其中新建作业,作业中添加1个备份步骤,类型是T-SQL脚本,然后在命令中输入如下SQL语句,该语句实现了对数据库Tes

  • SQL Server数据库基本概念、组成、常用对象与约束

    目录 二.基本概念 1.数据库 2.数据库管理系统 3.数据库系统 二.数据库的组成 1.文件 2.文件组 三.数据库常用对象 1.表 2.字段 3.视图 4.索引 5.存储过程 6.触发器 7.约束 8.缺省值 四.数据库约束 一.定义 二.分类 1.主键约束 2.外键约束 3.Unique约束 4.Check约束 5.Default约束 二.基本概念 1.数据库 数据库(DB):即DataBase的缩写,是按照一定的数据结构来组织.存储和管理数据的一个仓库.是存储在一起的相关数据的一个集合.

随机推荐