9 дек. 2008 г.

Java: WebDAV file upload

Есть задача: залить поток (н-р файл) из java на сервер, на котором крутится WebDAV, и конечно же с аутентификацией.
Конечно, можно использовать что-то более универсальное, более высокоуровневое типа Apache Jackrabbit, хотя стоит отметить, что я его только посмотрел - и годится ли он для данной задачи не скажу - может и ошибся.

Постановка задачи предельна проста - залить поток и внутренее желание - обойтись стандартным набором JDK.

Чуть поковырявшись - оказалось более-менее просто:
  // targetUrl - полный url целевого файла на сервере
final HttpURLConnection сonnection = (HttpURLConnection) targetURL.openConnection();

final String userPassword = username + ":" + password;
final String encoding = new sun.misc.BASE64Encoder().encode (userPassword.getBytes());

// Аутентификация
connection.setRequestProperty("Authorization", "Basic " + encoding);

connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setAllowUserInteraction(false);
// Метод закачки данных - обязательно PUT
connection.setRequestMethod("PUT");

final OutputStream out = new BufferedOutputStream(connection.getOutputStream());


// пишем в out всё, что необходимо


out.flush();
out.close();

// обязательно необходимо прочитать ответ
final InputStream is = pdfConnection.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(is));
final StringBuilder builder = new StringBuilder();
String line;

while ((line = reader.readLine()) != null) {
builder.append(line);
}

connection.disconnect();

Если такой файл уже существовал на сервере он будет просто перетёрт.

2 комментария:

jnsd комментирует...

А если NTLM нужен? и другие виды аутентификации?

Владимир Долженко комментирует...

2jnsd: если NTML или другие виды аутентификации нужны - то стоит смотреть в сторону чего-то более унифицированного, возможно тот же Jackrabbit. Здесь вообще произошёл финт ушами - обычный HTTP put запрос сработал для WebDAV'а