Holmes開発者ブログ

契約マネジメントシステム「ホームズクラウド」の開発者ブログです

WebDavでWord直接編集をしてみる

こんにちは、尿管結石を再発させてしまったid:c-terashimaです
数年ぶりに味わう痛みはやはり辛いですね。。皆さんも健康に気をつけて楽しいエンジニアライフを送っていきましょう

文章を書くにはWordを利用されている方が多く、契約書を作成するにも今使っているWordをそのまま使いたいというご要望をいただくことがあります
Wordを直接編集したら弊社ホームズクラウドへ登録される仕組みが可能か検討したところ、WebDavを使えばイケるのではないか?ということで早速試してみました

環境

次の環境で動作確認を行っています

  • Java8
  • SpringBoot
  • SpringSecurity
  • Word for Mac

TomcatWebDavを起動させる

ホームズクラウドはSpringBootで動作しているため、SpringBoot(Tomcat)上でWebDavを動作させる必要があります
TomcatWebdavServletクラスが用意されていますのでこちらを使っていきます

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        final TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setDocumentRoot(new File(documentRoot));
        return factory;
    }

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        // WebDavエンドポイントの設定
        ServletRegistrationBean bean = new ServletRegistrationBean(new WebdavServlet(), "/webdav/*");

        bean.setName("WebDav");
        bean.addInitParameter("debug", "1");
        bean.addInitParameter("listings", "true");
        bean.addInitParameter("readonly", "false");

        return bean;
    }

    @Bean
    public StrictHttpFirewall httpFirewall() {
        StrictHttpFirewall firewall = new StrictHttpFirewall();
        firewall.setAllowedHttpMethods(Arrays.asList(
                "HEAD", "DELETE", "POST", "GET", "OPTIONS", "PATCH", "PUT",
                "PROPFIND","PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK", "UNLOCK"
        ));
        return firewall;
    }
}

servletContainerメソッドでドキュメントルートをしており、Wordファイルが配置されるパスとなります。実際運用する場合は、クラウドストレージにファイルを格納することになります
servletRegistrationBeanメソッドでServletクラスの登録とエンドポイントを設定しています。ファイルアクセスする際に使われます
WebdavServletクラスにパラメータを設定する必要があります

  • debug:debugログの出力を制御
  • listings:ファイルリストの参照を制御。これをONにしないとファイル操作ができない
  • readonly:ファイルの書き込みを可能にする

WebDavでは独自のHttpMethodを利用するためSpringSecurityを利用していると弾かれてしまうため、登録します

メソッド 機能
PROPFIND プロパティの取得
PROPPATCH プロパティの変更
MKCOL コレクションの作成
COPY コレクションを含むリソースおよびプロパティの複製
MOVE コレクションを含むリソースの移動
LOCK コレクションを含むリソースのロック
UNLOCK コレクションを含むリソースのロック解除
OPTIONS 既存のメソッドと同じ
GET 既存のメソッドと同じ
HEAD 既存のメソッドと同じ
POST 既存のメソッドと同じ
PUT リソースの作成
DELETE コレクションおよびそのコレクションに含まれるリソースの削除

サーバ側の設定はこれだけです

ブラウザからアクセス

Office URI スキーマでブラウザからWebDavにアクセスを行いWordを開きます

Office URI スキーマとは

このドキュメントでは、オフィス生産性向上アプリケーション用の Uniform Resource Identifier (URI) の形式を定義します。このスキームは、Microsoft Office 2010 Service Pack 2 以降でサポートされており、これには Microsoft Office 2013 for Windows および Microsoft SharePoint 2013 などの製品が含まれます。また、Office for iPhone、Office for iPad、および Office for Mac 2011 でもサポートされます。

Office URI スキーマ | Microsoft Docsより引用

URIスキーマの仕様に則って ms-word:ofe|u|http://localhost:8080/webdav/test.docxにアクセスするとWordを起動するかを問うダイアログが表示されますので Microsoft Word.app を開くをクリックしてください。WebDavに公開されているWordが開きます
そのまま、編集し保存を行うと自動でサーバにアップロードされます

f:id:c-terashima:20201008190029g:plain

まとめ

SpringBoot(Tomcat)でWebDavは結構かんたんに実装することができました
ただ、最低限の動きを検証しただけなのでセキュリティなどには十分注意してください
ホームズクラウドにWordの直編集機能が組み込まれるのは近い!?







Holmesはエンジニア・デザイナーを募集しています!
興味がある方はこちらからご連絡ください!

lab.holmescloud.com

lab.holmescloud.com