基于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鹏 ...
随机推荐
- Mac mysql 忘记root密码的解决方法
1.执行命令以安全模式启动MySQL cd /usr/local/mysql/bin sudo ./mysqld_safe --skip-grant-tables 2.同上面目录下执行 '\) whe ...
- 【链接】在线压缩JS文件
在线压缩JS文件: http://yui.2clics.net/ https://refresh-sf.com/
- (二)Python的应用领域
Python 的应用领域主要有如下几个: Web应用开发 Python 经常被用于 Web 开发,尽管目前 PHP.JS 依然是 Web 开发的主流语言,但 Python 上升势头更劲.尤其随着 Py ...
- SQL Server sp_monitor使用
SQL Server提供了sp_monitor存储过程可以方便我们查看SQL Server性能统计信息,包括CPU/Network/IO,通过这些信息可以对自己的数据库性能状况有一个大致的了解. 下面 ...
- RT1052 BootLoader总结
RT1052 BootLoader总结 概述 Bootloader涉及到的RT1052单片机资源有:Cache,ram,外部SDRAM,ARM7汇编指令,外部dataFlash. 升级功能涉及到的其 ...
- KNN-k近邻算法
目录 KNN-k近邻算法 一.KNN基础 二.自己写一个knn函数 三.使用sklearn中的KNN 四.自己写一个面向对象的KNN 五.分割数据集 六.使用sklearn中的鸢尾花数据测试KNN 七 ...
- 05 Cookie.Session
Cookie:在浏览器中保存用户的信息 使用:由服务器创建,发送到浏览器保存,之后随着请求发回到服务器 1.创建cookie Cookie cookie = new Cookie("na ...
- 对于Node中Express框架的中间件概念的感知
中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...
- WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...
- js 杂症,this with 变量提升
一.this.xx 和 xx 是两回事 受后端语言影响,总把this.xx 和xx 当中一回事,认为在function中,xx 就是this.xx,其实完全两回事: this.xx 是沿着this 原 ...