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协议支撑办法的更多相关文章

  1. Python中的端口协议之基于UDP协议的通信传输

    UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较)        3.利用socketserver模块实现udp传输协议的并 ...

  2. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群

    需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...

  3. 【C#】MVC项目中搭建WebSocket服务器

    前言 因为项目需要,前端页面中需要不断向后台请求获取一个及一个以上的状态值.最初的方案是为每个状态值请求都建立一个定时器循环定时发起Ajax请求,结果显而 易见.在HTTP1.1协议中,同一客户端浏览 ...

  4. 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% ...

  5. office web apps 整合到自己项目中(wopi实现在线预览编辑)

    借助office web apps实现在线预览和在线编辑 我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作. 最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么 ...

  6. 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈

    本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...

  7. 第九章 基于HTTP的功能追加协议

    第九章 基于HTTP的功能追加协议 通过在HTTP的基础上添加新的功能来提高性能和功能. 一.消除HTTP瓶颈的SPDY SPDY(SPeeDY)目的是提高HTTP性能,缩短Web页面的加载时间(50 ...

  8. 【Nginx】如何基于主从模式搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!

    写在前面 最近出版了<海量数据处理与大数据技术实战>,详情可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文. 也有不少小伙伴 ...

  9. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

随机推荐

  1. 【翻译】Flink Table Api & SQL — 配置

    本文翻译自官网:Configuration https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/config.h ...

  2. SpringBoot配置热部署

    1.spring-boot-devtools 在pom中直接引入依赖 <dependency> <groupId>org.springframework.boot</gr ...

  3. .NET 小程序微信用户支付

    微信支付有两种模式:微信用户主动发起的支付.签约委托支付协议后自动支付. 自动支付又分为两种:首次支付时签约.纯签约. 首次支付时签约和纯签约在后续周期若需要发起自动扣款时,需要在应用服务中发起申请扣 ...

  4. snapde的批量文件数据过滤保存功能

    一.snapde基本介绍 Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏. 二.snapde批量数据筛选功能 如果想要对很多文件筛选出来 ...

  5. CentOS 7.7安装Erlang和Elixir

    安装之前,先看一下它们的简要说明 Erlang Erlang是一种开源编程语言,用于构建对高可用性有要求的大规模可扩展的软实时系统.它通常用于电信,银行,电子商务,计算机电话和即时消息中.Erlang ...

  6. WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍

    不知道大家对无线同屏技术有多少了解,当这种技术普及的时候,我想我们的工作与生活又会方便很多吧!下面是目前三种主流同屏技术的介绍: 目前这种将终端信号经由WiFi传输到电视.电视盒的技术有三种:DLNA ...

  7. 记一次修复yum被破坏

    现象 # yum There was a problem importing one of the Python modules required to run yum. The error lead ...

  8. MySQL单机优化---分表、分区、分库

    一.分表: 水平分表:根据条件把数据分为N个表(例如:商品表中有月份列,则可以按月份进行水平分表). 使用场景:一张表中数据太多,查询效率太慢. 当需要同时查询被水平分表的多张表时: 在两条SQL语句 ...

  9. Function Evaluation

    Author: Leisureeen Time Limit: 100ms Memory Limit: 65535KB Code Size Limit: 16 KB 64-bit integer IO ...

  10. Go调用Delphi编写的DLL

    参数整数没有问题,但是如果是字符串,要注意几个细节. 记录如下: 1.Delphi定义函数的时候,字符串参数需要使用PChar类型 2.Go传递参数的时候要将字符串转成UTF16的指针,接收的时候采用 ...