基于JFinal中搭建wopi协议支撑办法
1、添加maven依赖
<dependency>
<groupId>com.github.icecooly</groupId>
<artifactId>FastHttpClient</artifactId>
<version>1.7</version>
</dependency>
2、FastHttpClient示例
https://gitee.com/icecooly/FastHttpClient
3、在 Jfinal的Start.java中配置
/**
* 配置路由
*/
public void configRoute(Routes me) {
me.add("/baseService/wopiImpl", WopiController.class);
}
4、Handler控制器
package com.demo; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class WopiHandler extends com.jfinal.handler.Handler {
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
String[] actionParams = target.split("/");
int arParmsLength = 6;
String wopi="wopi";
String prefix="/baseService/wopiImpl/";
//1、变更jfinal的路由--->get文件下载请求
if (actionParams.length == arParmsLength && actionParams[2].equals(wopi) && actionParams[3].equals("files")
&& actionParams[5].equals("contents") && request.getMethod().equals("GET")) {
target=prefix+"download";
}
//2、保存修改内容
else if(actionParams.length == arParmsLength && actionParams[2].equals(wopi) && actionParams[3].equals("files")
&& actionParams[5].equals("contents") && request.getMethod().equals("POST"))
{
target=prefix+"save";
}
//3、获取文件内容
else if(actionParams.length == arParmsLength-1 && actionParams[2].equals(wopi) && actionParams[3].equals("files")
&& request.getMethod().equals("GET"))
{
target=prefix+"getInfo";
}
next.handle(target, request, response, isHandled);
}
}
5、WopiController.java
package com.demo.blog; import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.core.NotAction;
import com.jfinal.ext.interceptor.GET;
import com.jfinal.ext.interceptor.POST;
import com.jfinal.kit.Kv; import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64; public class WopiController extends Controller {
private String filePath = "D:\\Work\\"; /**
* 功能:配合wopi协议,提供文件下载
* 作者:黄海
* 时间:2019-08-17
* 用例: http://127.0.0.1/baseService/wopi/files/123.docx/contents
*/
@Before({GET.class})
public void download() {
String filename = getRequest().getRequestURI().split("/")[4];
renderFile(new File(filePath + filename));
} /**
* 功能:配合wopi协议,获取文件的信息
* 作者:黄海
* 时间:2019-08-17
* 用例:http://127.0.0.1/baseService/wopi/files/123.docx
*/
@Before({GET.class})
public void getInfo() throws IOException, NoSuchAlgorithmException {
String filename = getRequest().getRequestURI().split("/")[4];
File file = new File(filePath + filename);
Kv kv = Kv.by("BaseFileName", file.getName())
.set("OwnerId", "admin")
.set("Size", file.length())
.set("SHA256", getHash256(file))
.set("Version", file.lastModified())
.set("AllowExternalMarketplace", true)
.set("UserCanWrite", true)
.set("SupportsUpdate", true)
.set("SupportsLocks", true);
renderJson(kv);
} /**
* 功能:配合wopi协议,对修改后的文件进行保存
* 作者:黄海
* 时间:2019-08-17
*/
@Before({POST.class})
public void save() throws IOException, ServletException {
String filename = getRequest().getRequestURI().split("/")[4];
HttpServletRequest request=getRequest();
ServletInputStream is=request.getInputStream();
File file = new File(filePath+filename);
FileOutputStream os = new FileOutputStream(file);
byte[] bb = new byte[1024];
int ch;
while ((ch = is.read(bb)) > -1) {
os.write(bb, 0, ch);
}
os.close();
is.close();
renderNull();
} /**
* 获取文件的SHA-256值
*
* @param file
* @return
*/
@NotAction
private String getHash256(File file) throws IOException, NoSuchAlgorithmException {
String value = "";
try (InputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int numRead;
// 返回实现指定摘要算法的 MessageDigest 对象
MessageDigest digest = MessageDigest.getInstance("SHA-256");
do {
numRead = fis.read(buffer);
if (numRead > 0) {
// 更新摘要
digest.update(buffer, 0, numRead);
}
} while (numRead != -1); value = new String(Base64.getEncoder().encode(digest.digest()));
}
return value;
} }
6、测试类
package com.demo.blog; import io.itit.itf.okhttp.*;
import io.itit.itf.okhttp.util.FileUtil;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response; import java.io.File;
import java.io.InputStream; public class WopiTest {
/* */
public static void main(String[] args) throws Exception {
//1、测试下载文件
String url = "http://127.0.0.1/baseService/wopi/files/123.docx/contents";
testDownload(url); url = "http://127.0.0.1:8080/wopi/files/123.docx/contents";
testDownload(url); //2、获取文件信息
url = "http://127.0.0.1/baseService/wopi/files/123.docx";
testGetInfo(url); url = "http://127.0.0.1:8080/wopi/files/123.docx";
testGetInfo(url); //3、测试修改文件信息
url = "http://127.0.0.1/baseService/wopi/files/1234.docx/contents";
testSave(url); url = "http://127.0.0.1:8080/wopi/files/1234.docx/contents";
testSave(url);
} /**
* 功能:测试下载文件
*/
static void testDownload(String url) throws Exception {
String savePath = "c:\\123.docx";
InputStream is = FastHttpClient.get().url(url).build().execute().byteStream();
FileUtil.saveContent(is, new File(savePath));
} /**
* 功能:测试获取文件信息
*/
static void testGetInfo(String url) throws Exception {
String resp = FastHttpClient.get().url(url).build().execute().string();
System.out.println(resp);
} /**
* 功能:测试修改功能
* 作者:黄海
* 时间:2019-08-17
*
* @return
* @throws Exception
*/
static void testSave(String url) throws Exception {
String fileName = "项目通知.docx";
String filePath = "D:\\日常工作\\" + fileName;
byte[] fileContent = FileUtil.getBytes(filePath);
//原生方式
MediaType JSON = MediaType.parse("application/octet-stream");
RequestBody body = RequestBody.create(JSON, fileContent);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
基于JFinal中搭建wopi协议支撑办法的更多相关文章
- Python中的端口协议之基于UDP协议的通信传输
UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并 ...
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- 【C#】MVC项目中搭建WebSocket服务器
前言 因为项目需要,前端页面中需要不断向后台请求获取一个及一个以上的状态值.最初的方案是为每个状态值请求都建立一个定时器循环定时发起Ajax请求,结果显而 易见.在HTTP1.1协议中,同一客户端浏览 ...
- Mac上基于hexo+GitHub搭建个人博客(一)
原文地址: http://fanjiajia.cn/2018/11/23/Mac%E4%B8%8A%E5%9F%BA%E4%BA%8Ehexo+GitHub%E6%90%AD%E5%BB%BA%E4% ...
- office web apps 整合到自己项目中(wopi实现在线预览编辑)
借助office web apps实现在线预览和在线编辑 我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作. 最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么 ...
- 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈
本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...
- 第九章 基于HTTP的功能追加协议
第九章 基于HTTP的功能追加协议 通过在HTTP的基础上添加新的功能来提高性能和功能. 一.消除HTTP瓶颈的SPDY SPDY(SPeeDY)目的是提高HTTP性能,缩短Web页面的加载时间(50 ...
- 【Nginx】如何基于主从模式搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!
写在前面 最近出版了<海量数据处理与大数据技术实战>,详情可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文. 也有不少小伙伴 ...
- 如何基于Jupyter notebook搭建Spark集群开发环境
摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...
随机推荐
- html的rowspan和colspan
https://www.jb51.net/article/165695.htm rowspan工具 https://blog.csdn.net/oxiaobaio/article/details/80 ...
- React 简介
- js生成条形码——JsBarcode
原文地址:https://www.cnblogs.com/huangenai/p/6347607.html 介绍一下在GitHub生成条形码的js插件→JsBarcode 条码支持的有: CODE12 ...
- php imagick添加文字和图片的方法
Imagick添加文字和图片的方法<pre><?php $image = new Imagick(); $image->readImage("/home/www/wo ...
- .whl文件安装cuda10.0版本的pytorch1.3.0+torchvision0.4.1
$ python3 -m venv env3$ source env3/bin/activate$ cd env3/share/python-wheels 在此找到对应的版本:https://down ...
- 01-Windows Server 2012的配置与部署
一. 背景 这里以阿里云Windows Server 2012系统的服务器为主,介绍服务器的配置以及.Net程序的发布顺序,在后续的项目管理文章中,会介绍<运维手册>的写法. 二. 步骤 ...
- MyISAM 和 InnoDB 索引的区别
阅读目录 一 MyISAM索引实现 二 InnoDB索引实现 三 InnoDB索引和MyISAM索引的区别 回到顶部 一 MyISAM索引实现 1. 主键索引 MyISAM引擎使用B+树作为索引结 ...
- day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析
day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...
- GoLang 的变量
变量 1.为什么要变量 1.1.一个程序就是一个世界 1.2.变量是程序的基本组成单位 2.变量的介绍 2.1.变量的概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号, ...
- Spark之RDD容错原理及四大核心要点
一.Spark RDD容错原理 RDD不同的依赖关系导致Spark对不同的依赖关系有不同的处理方式. 对于宽依赖而言,由于宽依赖实质是指父RDD的一个分区会对应一个子RDD的多个分区,在此情况下出现部 ...