基于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鹏 ...
随机推荐
- PAT 甲级 树专题小结
1.已知两个序链表建树 先序中序建树 PAT 1086 node *buildTree(vector<int>pre,vector<int>in,int pl,int pr,i ...
- 图文讲解Android ImageView的ScaleType
ScaleType的设置方式包括: 1. 在layout的xml中定义android:scaleType="xxx": 2. 在java代码中调用imageView.setScal ...
- SpringBoot小技巧:统一异常处理
SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...
- 【Spring Cloud学习之一】微服务架构
一.网站架构模式发展 单体应用-->SOA-->微服务 1.分布式项目与项目集群分布式项目:根据业务需求进行拆分成N个子系统,多个子系统相互协作才能完成业务流程子系统之间通讯使用RPC远程 ...
- Python鼠标模拟
有时候我们需要使用python执行一些脚本,可能需要让程序自动按键或自动点击鼠标,下面的代码实现了对键盘的模拟按键, 需要安装pypiwin32,当然也可以直接用ctypes来实现. 输入:pip i ...
- MF 模拟器读取PC串口数据
using System; using Microsoft.SPOT; using Microsoft.SPOT.Input; using Microsoft.SPOT.Presentation; u ...
- Servlet3.0对异步处理的支持
Servlet工作流程 Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 调用业务接口的某些方 ...
- [转帖]浅谈分布式一致性与CAP/BASE/ACID理论
浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...
- 开灯问题—C语言
开灯问题 有n盏灯,编号为1~n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关,以此类推.一共有k个人,问最后哪些灯是开着?输入n和 ...
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...