Spring Boot WebDav内のファイルをダウンロードする

Spring Boot

この記事では、JavaのSpring Bootを利用してWebDav内に保存されているファイルをダウンロードする方法を解説します。

JavaLearning

よく利用する処理を書き出す

WebDavサーバの情報を保持するオブジェクトクラスを作成する

オブジェクトクラスにWebDavのURLや、認証のためのユーザーやパスワードを持たせておきます。

package com.example;

public class WebDavServerObject {
    
    private Integer davId;
    private String davName;
    private String davUrl;
    private String davUserId;
    private String davUserPass;



    public Integer getDavId() {
        return this.davId;
    }

    public void setDavId(Integer davId) {
        this.davId = davId;
    }

    public String getDavName() {
        return this.davName;
    }

    public void setDavName(String davName) {
        this.davName = davName;
    }

    public String getDavUrl() {
        return this.davUrl;
    }

    public void setDavUrl(String davUrl) {
        this.davUrl = davUrl;
    }

    public String getDavUserId() {
        return this.davUserId;
    }

    public void setDavUserId(String davUserId) {
        this.davUserId = davUserId;
    }

    public String getDavUserPass() {
        return this.davUserPass;
    }

    public void setDavUserPass(String davUserPass) {
        this.davUserPass = davUserPass;
    }
}

認証情報を作成する

WebDavを利用する際には、Basic認証が必要になることがよくあります。
その場合認証情報を作成するメソッドは、よく利用するのであらかじめ書き出しておきます。

// 認証情報作成
private static String getAuthorizationString(String username, String password) {
    String userpass = username + ":" + password;
    return Base64.getEncoder().encodeToString(userpass.getBytes());
}

ファイルやフォルダが存在するかを確認する

WebDav内のファイルやフォルダの存在を確認するメソッドもよく利用するのであらかじめ書き出しておきます。

// WebDavフォルダの存在確認
private static boolean checkWebDavFolderExistence(String webdavUrl, String username, String password) {
    try {
        URL url = new URL(webdavUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("HEAD");
        connection.setRequestProperty("Authorization", "Basic "
            + getAuthorizationString(username, password));
        int responseCode = connection.getResponseCode();
        connection.disconnect();
        return responseCode == HttpURLConnection.HTTP_OK;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

ファイルをダウンロードする

あらかじめ作っておいたメソッドを利用しながら、WebDavに保存されているファイルをダウンロードします。

public ResponseEntity<InputStreamResource> getDownloadFile(WebDavServerObject davServer, String fileName) throws IOException {

    String webdavServerUrl = davServer.getDavUrl() + "/folderPath/" + fileName;
    if (!checkWebDavFolderExistence(webdavServerUrl, davServer.getDavUserId(), davServer.getDavUserPass())) {
        throw new IOException("the same file not exists.");
    }

    URL url;
    ResponseEntity<InputStreamResource> response = null;
    try {
        url = new URL(webdavServerUrl);


        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Authorization", "Basic "
            + getAuthorizationString(davServer.getDavUserId(), davServer.getDavUserPass()));
        connection.setRequestMethod("GET");
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        response = new ResponseEntity<>(new InputStreamResource(inputStream), headers, HttpStatus.OK);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return response;
}

今まで紹介したメソッドは、WebDavサーバの情報を保持するオブジェクトクラス意外全てをサービスクラスに記載します。
全てをまとめると、サービスクラスは以下のようになります。

package com.example;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Base64;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import com.example.WebDavServerObject;


@Service
public class WebdavFileManagementService {


public ResponseEntity<InputStreamResource> getDownloadFile(WebDavServerObject davServer, String fileName) throws IOException {

    String webdavServerUrl = davServer.getDavUrl() + "/folderPath/" + fileName;
    if (!checkWebDavFolderExistence(webdavServerUrl, davServer.getDavUserId(), davServer.getDavUserPass())) {
        throw new IOException("the same file not exists.");
    }

    URL url;
    ResponseEntity<InputStreamResource> response = null;
    try {
        url = new URL(webdavServerUrl);


        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Authorization", "Basic "
            + getAuthorizationString(davServer.getDavUserId(), davServer.getDavUserPass()));
        connection.setRequestMethod("GET");
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        response = new ResponseEntity<>(new InputStreamResource(inputStream), headers, HttpStatus.OK);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return response;
}


// 認証情報作成
private static String getAuthorizationString(String username, String password) {
    String userpass = username + ":" + password;
    return Base64.getEncoder().encodeToString(userpass.getBytes());
}


// WebDavフォルダの存在確認
private static boolean checkWebDavFolderExistence(String webdavUrl, String username, String password) {
    try {
        URL url = new URL(webdavUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("HEAD");
        connection.setRequestProperty("Authorization", "Basic "
            + getAuthorizationString(username, password));
        int responseCode = connection.getResponseCode();
        connection.disconnect();
        return responseCode == HttpURLConnection.HTTP_OK;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}


}

コントローラークラスから呼び出す

WebDavに書き込むメソッドを呼び出すコントローラークラスを作成します。
ブラウザなどからファイルダウンロードの命令を受け取るのは、このコントローラークラスになります。

package com.example;

import java.io.IOException;
import java.net.HttpURLConnection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.WebDavServerObject;

@Controller
public class WebdavFileManagementController {


    @Autowired
    private WebdavFileManagementService webdavFileManagementService;


    @GetMapping(value="/download")
    public ResponseEntity<InputStreamResource> downloadFile(@RequestParam("fileName") String fileName) {

        // 適切にWebDavServer情報を取得するよう書き換えてください
        WebDavServerObject davServer = new WebDavServerObject();

        ResponseEntity<InputStreamResource> response = null;

        try {
            response = webdavFileManagementService.getDownloadFile(davServer, fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return response;
    }

まとめ

今回は、WebDavに保存されているファイルをダウンロードする方法を解説しました。
他にもWebDavに関する以下の記事を公開していますので、よろしければそちらもご覧ください。

それでは〜。

コメント

タイトルとURLをコピーしました