一般的office的厂家会提供多种产品的集成方式,这里介绍的是使用js集成office插件;作为一个入职3个月的小白,碰巧公司让我研究一下这个第三方产品,主要完成数据库表bolb文件下载与使用该office文件修改后的上传,本人在此把这些分享给大家,不足之处大家包涵!!!
1.这个便是厂家提供的js方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DeepLink App</title>
<script src="office.sdk.js"></script>
</head>
<body>
<h5>安卓/苹果 DeepLinks(URL Schemas) 适用</h5>
<button οnclick="createNewWordDocument()">新建word文档</button>
<button οnclick="openServerWordDocument()">打开服务器word文档</button>
<button οnclick="openServerPDFDocument()">打开服务器pdf文档</button>
<script type="text/javascript">
// 启用DeepLinks
Office.enabledDeepLinks();
function createNewWordDocument() {
var word = Office.newWordDocument();
// COMPATIBLE 指的是doc/xls/ppt格式的文档
// LATEST 指的是docx/xlsx/pptx的文档
word.version = OfficeVersion.LATEST;
word.fileName = "新建空白文档";
word.uploadURL = "http://www.ntko.com:1986/mobileoffice/servlet/UploadServlet?filename=blank.docx&filetype=docx";
var config = Office.newWordDocumentConfig();
// 添加自定义表单参数
var authHeader = new FormField();
authHeader.name = "Authorization";
authHeader.value = "Bearer eyJhbGciOiJSUzI1N....";
var field2 = new FormField();
field2.name = "key1";
field2.value = "value1";
config.formFields.push(authHeader);
config.formFields.push(field2);
// 配置文档属性
config.enableHandWrite = true;
config.enableRevision = true;
config.enableCopy = true;
config.enableEditComment = true;
config.enablePrint = true;
config.enableSaveAs = true;
config.enableSendMail = true;
config.enableShare = true;
config.enableExportToPDF = true;
// 设置文档属性
word.config = config;
// 新建空白文档
Office.createNewWord(word);
}
function openServerWordDocument() {
var word = Office.newWordDocument();
word.fileName = "201703131703.doc";
word.downloadURL = "http://www.ntko.com:1986/mobileoffice/servlet/DownloadServlet?filename=201703131703.doc";
word.uploadURL = "http://www.ntko.com:1986/mobileoffice/servlet/UploadServlet?filename=201703131703.doc&filetype=doc";
var config = Office.newWordDocumentConfig();
// 添加自定义表单参数
var field1 = new FormField();
field1.name = "key1";
field1.value = "value1";
var field2 = new FormField();
field2.name = "key1";
field2.value = "value1";
config.formFields.push(field1);
config.formFields.push(field2);
var bookmarkRep1 = new FormField();
bookmarkRep1.name = "ReplaceHere";
bookmarkRep1.value = "这是第一个书签替换后的值";
var bookmarkRep2 = new FormField();
bookmarkRep2.name = "ReplaceHere";
bookmarkRep2.value = "这是第二个书签替换后的值";
config.bookmarkReplacement.push(bookmarkRep1);
config.bookmarkReplacement.push(bookmarkRep2);
// 配置文档属性
config.enableHandWrite = true;
config.enableRevision = true;
config.enableCopy = true;
config.enableEditComment = true;
config.enablePrint = true;
config.enableSaveAs = true;
config.enableSendMail = true;
config.enableShare = true;
config.enableExportToPDF = true;
// 设置文档属性
word.config = config;
// 打开服务器文档
Office.openWordFromURL(word);
}
function openServerPDFDocument() {
var pdf = Office.newPDFDocument();
pdf.fileName = "NTKOPDF.pdf";
pdf.downloadURL = "http://www.ntko.com:1986/mobileoffice/servlet/DownloadServlet?filename=NTKOPDF.pdf";
pdf.uploadURL = "http://www.ntko.com:1986/mobileoffice/servlet/UploadServlet?filename=NTKOPDF.pdf&filetype=pdf";
var config = Office.newPDFDocumentConfig();
// 用户名称
config.username = "Hybrid 测试用户";
// 打开手写笔功能
config.usePenMode = true;
// 添加自定义表单参数
var field1 = new FormField();
field1.name = "key1";
field1.value = "value1";
var field2 = new FormField();
field2.name = "key1";
field2.value = "value1";
config.formFields.push(field1);
config.formFields.push(field2);
// 配置文档属性
config.enableEdit = true;
config.enableCopy = true;
config.enablePrint = true;
config.enableSaveAs = true;
config.enableShareAndSendMail = true;
// 设置文档属性
pdf.config = config;
// 打开服务器文档
Office.openPDFFromURL(pdf);
}
</script>
</body>
</html>
其实主要就是2个方法,一个就是关于创建新的文档,一个是打开一个已经存在文档;
主要就是这两个属性:word.downloadURL与word.uploadURL
word.downloadURL是一个下载文件的url;word.downloadURL则是负责文件上传url;实现这两个url的上传下载;
2.由于对.net项目不了解(本人刚学习java啊...),所以只好采用servlet的方式将数据库BLOB的文件进行下载,将二进制格式的文件传入数据库blob格式的字段(通过world.download下载的文件,厂家会提供一个字段来获取二进制文件,此处字段为“fileUpload”)
package Servlet;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UpServlet
*/
public class FileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FileServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String filename = request.getParameter("filename");// 下载的文件名
String flag = request.getParameter("flag");// 区分上传下载参数
String tName = request.getParameter("tName");// 操作的表名
String DM_CODE = request.getParameter("DM_CODE");// 表的主键
String clumName = request.getParameter("clumName");// blob数据的列名
if (flag.equalsIgnoreCase("UP")) {
upfile(request, response, tName, DM_CODE, clumName, filename);
}
if (flag.equalsIgnoreCase("DOWN")) {
downfile(request, response, tName, DM_CODE, clumName, filename);
}
if (flag.equalsIgnoreCase("UPDATE")) {
updateFile(request, response, tName, DM_CODE, clumName);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public void updateFile(HttpServletRequest request, HttpServletResponse response, String tName, String DM_CODE,
String clumName) throws ServletException, IOException {
InputStream in = null;
Connection conn = null;
InputStream indata = null;
PreparedStatement pst = null;
try {
// 解析http请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 解析成功
if (isMultipart == true) {
// 获得磁盘文件条目工厂
FileItemFactory factory = new DiskFileItemFactory();
// 高水平的API文件上传处理,将文件保存在服务器硬盘
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传的单个文件的大小100M
upload.setSizeMax(100 * 1024 * 1024);
// 设置上传的总文件的大小100M
upload.setFileSizeMax(100 * 1024 * 1024);
List<FileItem> fileItemList = upload.parseRequest(request);
// 如果表单内容不为空
if (fileItemList != null) {
// 遍历请求内容
for (FileItem fileItem : fileItemList) {
if (fileItem.getFieldName().equalsIgnoreCase("fileUpload")) {
in = fileItem.getInputStream();
byte[] buffer = new byte[in.available()];
indata = getServletContext().getResourceAsStream("/WEB-INF/datebase.properties");
Properties props = new Properties();
try {
props.load(indata);
} catch (IOException e) {
e.printStackTrace();
return;
}
String driver = props.getProperty("db.driver");
String URL = props.getProperty("db.url");
String USER = props.getProperty("db.username");
String PASSWORD = props.getProperty("db.password");
// 1.加载驱动程序
Class.forName(driver);
// 2.获得数据库链接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
String s = "update " + tName + " set " + clumName + "=? where DM_CODE=" + DM_CODE;
pst = conn.prepareStatement(s);
pst.setBinaryStream(1, in, buffer.length);
pst.execute();
fileItem.delete();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(indata!=null){
indata.close();}
if(pst!=null){
pst.close();}
if(conn!=null){
conn.close();}
if(in!=null){
in.close();}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
protected void downfile(HttpServletRequest request, HttpServletResponse response, String tName, String DM_CODE,
String clumName, String filename) throws ServletException, IOException {
InputStream indata = null;
Connection conn = null;
PreparedStatement pst = null;
ServletOutputStream out = null;
InputStream ins = null;
try {
out = response.getOutputStream();
response.reset();
response.setContentType("application/msword;charset=GBK");
indata = getServletContext().getResourceAsStream("/WEB-INF/datebase.properties");
Properties props = new Properties();
try {
props.load(indata);
} catch (IOException e) {
e.printStackTrace();
return;
}
String driver = props.getProperty("db.driver");
String URL = props.getProperty("db.url");
String USER = props.getProperty("db.username");
String PASSWORD = props.getProperty("db.password");
// 1.加载驱动程序
Class.forName(driver);
// 2.获得数据库链接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
if (tName.equals("RD_FILE")) {
String sql = "select " + clumName + ",FILENAME from " + tName + " where DM_CODE=" + DM_CODE + "";
pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
java.sql.Blob blob = rs.getBlob(clumName);
ins = blob.getBinaryStream();
String fname=rs.getString("FILENAME");
response.setHeader("Content-Disposition", "attachement;filename=" + fname + ";");
// 下面将BLOB数据写入文件
byte[] b = new byte[1024];
int len = 0;
while ((len = ins.read(b)) != -1) {
out.write(b, 0, len);
}
}
} else {
String sql = "select " + clumName + " from " + tName + " where DM_CODE=" + DM_CODE + "";
pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
java.sql.Blob blob = rs.getBlob(clumName);
ins = blob.getBinaryStream();
response.setHeader("Content-Disposition", "attachement;filename=" + filename + ";");
// 下面将BLOB数据写入文件
byte[] b = new byte[1024];
int len = 0;
while ((len = ins.read(b)) != -1) {
out.write(b, 0, len);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
indata.close();
ins.close();
out.flush();
out.close();
try {
pst.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void upfile(HttpServletRequest request, HttpServletResponse response, String tName, String DM_CODE,
String clumName, String filename) throws ServletException, IOException {
InputStream in = null;
Connection conn = null;
InputStream indata = null;
PreparedStatement pst = null;
try {
// 解析http请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 解析成功
if (isMultipart == true) {
// 获得磁盘文件条目工厂
FileItemFactory factory = new DiskFileItemFactory();
// 高水平的API文件上传处理,将文件保存在服务器硬盘
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传的单个文件的大小100M
upload.setSizeMax(100 * 1024 * 1024);
// 设置上传的总文件的大小100M
upload.setFileSizeMax(100 * 1024 * 1024);
List<FileItem> fileItemList = upload.parseRequest(request);
if (fileItemList != null) {
// 遍历请求内容
for (FileItem fileItem : fileItemList) {
if (fileItem.getFieldName().equalsIgnoreCase("fileUpload")) {
in = fileItem.getInputStream();
byte[] buffer = new byte[in.available()];
indata = getServletContext().getResourceAsStream("/WEB-INF/datebase.properties");
Properties props = new Properties();
try {
props.load(indata);
} catch (IOException e) {
e.printStackTrace();
return;
}
String driver = props.getProperty("db.driver");
String URL = props.getProperty("db.url");
String USER = props.getProperty("db.username");
String PASSWORD = props.getProperty("db.password");
// 1.加载驱动程序
Class.forName(driver);
// 2.获得数据库链接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
// 如果操作的表为RD_FILE,则需修改sql
String s;
if (tName.equals("RD_FILE")) {
String filetype = filename.split("\\.")[1];
s = "insert into " + tName + "(DM_CODE," + clumName + ",RD_TYPE,FILENAME) values('"
+ DM_CODE + "',?,'" + filetype + "','" + filename + "')";
} else {
s = "insert into " + tName + "(DM_CODE," + clumName + ") values(" + DM_CODE + ",?)";
}
pst = conn.prepareStatement(s);
pst.setBinaryStream(1, in, buffer.length);
pst.execute();
fileItem.delete();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
indata.close();
pst.close();
conn.close();
in.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.配置servlet把2个访问地址传入相应url即可;