[Java] WebDAVからファイルをダウンロード

[Java] WebDAVからファイルをダウンロード

Javaにて、WebDAVからファイルをダウンロードして指定の場所にファイルを保存する処理を実装する

commons-vfs を使用すると、あたかもローカルファイルを操作するかのようにWebDAV上のファイルを扱える。
Apache Commons VFS – Commons Virtual File System

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>smuplus</groupId>
 <artifactId>sample-webdav</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 -->
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-vfs2</artifactId>
   <version>2.2</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.6</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
  <dependency>
   <groupId>commons-httpclient</groupId>
   <artifactId>commons-httpclient</artifactId>
   <version>3.1</version>
  </dependency>
 </dependencies>
</project>

commons-httpclient はメンテナンスが止まっているようで、Apache HttpComponents にある httpclient が後継のようだが、 commons-vfscommons-httpclient に依存しており、Apache HttpClient に差し替えると WebDAV へのアクセス時に例外が起きてしまった。
仕方がないので commons-httpclient の最終バージョンを指定しておく。

実装は以下のような感じになる。

package sample;

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

import org.apache.commons.io.FileUtils;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.VFS;

public class Program {

 public static void main(String[] args) {
  String source = "http://admin:password@localhost/dav/OP2Loop.mp3";
  String dest= "C:/App/temp/OP2Loop.mp3";
  
  try {
   // input
   FileObject file = VFS.getManager().resolveFile(source);
   InputStream inputStream = file.getContent().getInputStream();
   // output
   File output = new File(dest);
   // Copy
   FileUtils.copyInputStreamToFile(inputStream, output);
  } catch (FileSystemException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }  
 }
}

URLを文字列で定義し、その InputStream を取得する処理が2行で書ける。

FileUtilscommons-io の提供するUtilityクラスで、ファイルやディレクトリのコピーを容易にする。


Apache Commons は古くからあるライブラリだけど、便利なUtilityクラスが多数提供されているので、時間があるときに眺めていると発見がありそう。

コメント

このブログの人気の投稿

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

蛍光灯フリッカー現象 (ちらつき) の対策