基于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、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.upload.UploadFile;
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() {
        String filename = getRequest().getRequestURI().split("/")[4];
        FileInfo info = new FileInfo();
        try {
            if (filename != null && filename.length() > 0) {
                File file = new File(filePath + filename);
                if (file.exists()) {
                    info.setBaseFileName(file.getName());
                    info.setSize(file.length());
                    info.setOwnerId("admin");
                    info.setVersion(file.lastModified());
                    info.setSha256(getHash256(file));
                }
            }
            renderJson(info);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能:配合wopi协议,对修改后的文件进行保存
     * 作者:黄海
     * 时间:2019-08-17
     */
    @Before({POST.class})
    public void save() throws IOException {
        UploadFile uf=getFile("content");
        File upFile = new File(filePath+uf.getFileName());
        if (!upFile.getParentFile().exists()) {
            upFile.getParentFile().mkdirs();
        }
        if(upFile.exists())
        {
            upFile.delete();
        }
        uf.getFile().renameTo(upFile);
        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;
    }

}

5、FileInfo.java

package com.demo.blog;

import java.io.Serializable;

/**
 * 文件属性对象
 *
 * 由于wopi的接口不遵守驼峰命名规则,所以需要用@JsonProperty指定别名
 * Created by ethendev on 2017/4/15.
 */
public class FileInfo implements Serializable {

    /**
     * 文件名
     */
    private String baseFileName;

    /**
     * 文件所有者的唯一编号
     */
    private String ownerId;

    /**
     * 文件大小,以bytes为单位
     */
    private long size;

    /**
     * 文件的256位bit的SHA-2编码散列内容
     */
    private String sha256;

    /**
     * 文件版本号,文件如果被编辑,版本号也要跟着改变
     */
    private long version;

    /**
     * 允许外部服务的连接
     */
    private boolean allowExternalMarketplace = true;

    /**
     * 更改文件的权限
     */
    private boolean userCanWrite = true;

    /**
     * 是否支持更新
     */
    private boolean supportsUpdate = true;

    /**
     * 是否支持锁定
     */
    private boolean supportsLocks = true;

    public String getBaseFileName() {
        return baseFileName;
    }

    public void setBaseFileName(String baseFileName) {
        this.baseFileName = baseFileName;
    }

    public String getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(String ownerId) {
        this.ownerId = ownerId;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public String getSha256() {
        return sha256;
    }

    public void setSha256(String sha256) {
        this.sha256 = sha256;
    }

    public long getVersion() {
        return version;
    }

    public void setVersion(long version) {
        this.version = version;
    }

    public boolean isAllowExternalMarketplace() {
        return allowExternalMarketplace;
    }

    public void setAllowExternalMarketplace(boolean allowExternalMarketplace) {
        this.allowExternalMarketplace = allowExternalMarketplace;
    }

    public boolean isUserCanWrite() {
        return userCanWrite;
    }

    public void setUserCanWrite(boolean userCanWrite) {
        this.userCanWrite = userCanWrite;
    }

    public boolean isSupportsUpdate() {
        return supportsUpdate;
    }

    public void setSupportsUpdate(boolean supportsUpdate) {
        this.supportsUpdate = supportsUpdate;
    }

    public boolean isSupportsLocks() {
        return supportsLocks;
    }

    public void setSupportsLocks(boolean supportsLocks) {
        this.supportsLocks = supportsLocks;
    }

    @Override
    public String toString() {
        return "FileInfo{" +
                "baseFileName=‘" + baseFileName + ‘\‘‘ +
                ", ownerId=‘" + ownerId + ‘\‘‘ +
                ", size=" + size +
                ", sha256=‘" + sha256 + ‘\‘‘ +
                ", version=" + version +
                ", allowExternalMarketplace=" + allowExternalMarketplace +
                ", userCanWrite=" + userCanWrite +
                ", supportsUpdate=" + supportsUpdate +
                ", supportsLocks=" + supportsLocks +
                ‘}‘;
    }

}

6、测试类

package com.demo.blog;
import io.itit.itf.okhttp.*;
import io.itit.itf.okhttp.util.FileUtil;

import java.io.File;
import java.io.InputStream;

public class WopiTest {
    /*

    */
    public static void main(String[] args) throws Exception {
        //1、测试下载文件
        testDownload();
        //2、获取文件信息
        testGetInfo();
        //3、测试修改文件信息
        testSave();
    }

    /**
     * 功能:测试下载文件
     */
    static void testDownload() throws Exception {
        String url = "http://127.0.0.1/baseService/wopi/files/123.docx/contents";
        String savePath="c:\\123.docx";
        InputStream is=FastHttpClient.get().url(url).build().execute().byteStream();
        FileUtil.saveContent(is, new File(savePath));
    }

    /**
     * 功能:测试获取文件信息
     */
    static void testGetInfo() throws Exception {
        String url = "http://127.0.0.1/baseService/wopi/files/123.docx";
        String resp= FastHttpClient.get().url(url).build().execute().string();
        System.out.println(resp);
    }

    /**
     * 功能:测试修改功能
     * 作者:黄海
     * 时间:2019-08-17
     *
     * @return
     * @throws Exception
     */
    static void testSave() throws Exception {
        String url = "http://127.0.0.1/baseService/wopi/files/1234.docx/contents";
        String fileName = "项目通知.docx";
        String filePath = "D:\\日常工作\\" + fileName;
        byte[] fileContent=FileUtil.getBytes(filePath);
        Response response = FastHttpClient.post().
                url(url).
                addFile("content", fileName, fileContent).
                build().
                execute();
        System.out.println(response.body().string());
    }
}

原文地址:https://www.cnblogs.com/littlehb/p/11368100.html

时间: 2024-07-31 20:36:28

基于JFinal中搭建wopi协议支撑办法的相关文章

在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom failed: ECONNRESET错误. 开始我的解决方法是每次向PLC发送一条数据后关掉socket,但是这样做太极端了. 经过分析发现是由于发送的数据包大小我设定为256,当写入1个寄存器值时,Modbus服务端直接报错,关掉了socket连接,将发送的数据包大小改成实际的大小后解决问题.

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

UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) ------------------------------------------------------------------------------------------------------------------------------------- 一.UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议 与TCP协

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

需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服务的性能. SQL Server始终在负载均衡集群方面都缺少自己的产品,多由第三方厂家提供,但SQL Server故障转移集群却由来已久,在SQL Server 2012还提供了一个可用性组(AlwaysOn High Availability Groups)的新特性,我们知道微软的故障转移集群(W

基于文件传输的UDP协议分析(1)

网络通信与数据交换已经成为现代软件必备的基础功能. 目前公司上下位机的网络通信均采用TCP/ UDP协议进行数据交换和控制.这种低层次的网络通信协议在小数据量,少互交的领域有着较大的优势.但是随着网络功能需求的日趋旺盛,TCP/UDP协议日渐无法满足需求,其弊端日渐明显 *TCP/UDP通信编程可分为: 1  通信控制层 通信控制层负责网络的配置,连接,发送数据, 接受数据响应, 中断等服务 2数据处理层 数据处理层主要负责数据的封包,解包,校验等工      作.简称: "数据协议的程序化过程

搭建XMPP协议,实现自主推送消息到手机

参考网址: http://www.devdiv.com/thread-101586-1-1.html 关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的C2DM,具体不细说,缺点,服务器在国外,你懂得,不是很稳定.3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性.它的特点是将复杂性从客户端转移到了服务器端.听说GTalk.

基于 Jenkins 快速搭建持续集成环境

持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础.Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能.本文正是从持续集成的基本概念入手,通过具体实例,介绍了如何基于 Jenkins 快速搭建持续集成环境. 持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变

Apache LINUX中搭建HTTP服务器

LINUX中搭建HTTP服务器 在LINUX系统中安装Apache做为HTTP的服务程序,通过设置配置文件,可以实现很多功能,如访问控制,虚似主机,基于域名的虚拟主机,通过安装Awstats我们可以更方便的统计Http访问日志 实验拓扑: Linux Client -----RHEL5.9(vmnet1)----------(vmnet1) Win7 Client 实验一:查看默认HTTP配置 找到默认红帽欢迎页面 (/etc/httpd/conf/httpd.conf ---->Include

HighCharts绘制JS折线图(后台传数据给前台基于JFinal框架)

/*****************************Controller(基于JFinal框架)**************/ package com.zzu.controller;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilitie

基于AVR128的简单Modbus协议实现

Modbus通讯协议是由Modicon公司在1979年开发的,应用于工业现场控制的总线协议.Modbus通讯系统包括带有可编程控制的芯片节点和公共传输线组成,其目的是用于多节点数据的采集和监控.Modbus协议采用主从模式,通讯系统中有一个主机对多个节点从机进行监控,从机节点最多支持247个.每个从机均有自己独立的从机地址,而且改地址能够被主机识别. 能够支持Modbus协议的通讯系统有RS-232,RS-422,RS-485等.同时Modbus协议具有标准.开放.免费.帧格式简单等特点而被广大