[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-vfs
が commons-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行で書ける。
FileUtils
は commons-io
の提供するUtilityクラスで、ファイルやディレクトリのコピーを容易にする。
Apache Commons は古くからあるライブラリだけど、便利なUtilityクラスが多数提供されているので、時間があるときに眺めていると発見がありそう。
コメント
コメントを投稿