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. iOS - 在xib中UILabel文字如何换行

    在换行的位置按住Option + Enter键即可换行

  2. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成

    熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...

  3. Linux——xargs命令学习

    有时候我们会遇到需要将指定命令返回结果进行处理的情况 这种情况下,可能就需要写for循环之类的脚本进行处理了(目前我只能想到这种方法) 但是想起来还有一个xargs命令,组合这个命令就比较省事了. 场 ...

  4. mysql笔记7--一句查询语句的过程

    1 sql语句示例 select *from A where id=1 2 mysql基本架构图 (1)Mysql分为Server层和引擎层两个部分 (2)Server层包括连接器,查询缓存,分析器, ...

  5. Apache Kafka® is a distributed streaming platform

    Kafka Connect简介 我们知道过去对于Kafka的定义是分布式,分区化的,带备份机制的日志提交服务.也就是一个分布式的消息队列,这也是他最常见的用法.但是Kafka不止于此,打开最新的官网. ...

  6. activiti学习3:流程引擎对象和流程引擎配置对象

    目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...

  7. nginx 进程问题

    1 nginx的进程分为四种 master worker cacheLoader cacheManager. 实际接收请求的进程是 worker,master监控worker节点,之所以会多进程模式, ...

  8. Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'xxxxx.Controllers.xxxxController'.

    Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activa ...

  9. docker 命令(我使用过的)

    是否安装docker:    docker version 启动docker:    service docker start 查看本机可用镜像:    docker images 删除镜像: doc ...

  10. 一文读懂 IPv4 到 IPv6 的过渡技术

    在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6.什么是 IPv4?IPv4 全称为 Internet Protocol version 4,它为互联网上的每 ...