2010-02-14 9 views
7

Moja aplikacja ajax ładuje plik do kontenera aplikacji Java z przeglądarki użytkownika. Chciałbym to zrobić: po zakończeniu przesyłania chcę "wysłać" plik na serwer WebDAV, zidentyfikowany przez nazwę hosta (np. Localhost), port (np. 8080) i lokalizację, w której chcę do przechowywania pliku (np. dir1/dir2).Java: Jak przesłać plik na serwer WebDAV z serwletu?

Poszukiwane jest zasadniczo szkielet klienta WebDAV, który pozwala przesłać plik do WebDAV. W mojej aplikacji używam już "webdavclient4j", ale wydaje mi się, że nie znalazłem sposobu na przesłanie pliku za jego pomocą?

Wszelkie pomysły? Z góry dziękujemy za wszelką pomoc, jakiej możesz udzielić.

F

Odpowiedz

12

Można to zrobić z zaledwie kilku linii kodu za pomocą mojego niedawno zwolniony i bardzo łatwy w użyciu nowoczesny klient webdav dla java, Sardine. Oto kilka przykładów (pierwszy z nich używa commons-IO do odczytu pliku):

Sardine sardine = SardineFactory.begin("username", "password"); 
byte[] data = FileUtils.readFileToByteArray(new File("/file/on/disk")); 
sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", data); 

lub wykorzystujące strumienie:

Sardine sardine = SardineFactory.begin("username", "password"); 
InputStream fis = new FileInputStream(new File("/some/file/on/disk.txt")); 
sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", fis); 

https://github.com/lookfirst/sardine

okrzyki,

Jon

+0

Witaj Jon, dzięki za odpowiedź. Próbowałem Sardine i zdecydowałem się użyć jej w moich aplikacjach. Sprawia, że ​​rzeczy są znacznie łatwiejsze. F – francescoNemesi

+0

Ja też wprowadziłem Sardynkę. Niezwykle prosty sposób na stworzenie usługi sieciowej - teraz muszę to wszystko przetestować;) –

+0

@Jon: Czy istnieje sposób na bezpośrednie przesłanie katalogu? A jeśli na serwerze internetowym znajduje się katalog, czy po prostu zastąpi on pliki? – rkg

6

Można użyć Jackrabbit WebDAV Library.

Przykładem klienta WebDAV, aby przesłać zawartość do serwera WebDAV (zaczerpnięte z here):

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.URL; 
import org.apache.commons.httpclient.Credentials; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpException; 
import org.apache.commons.httpclient.UsernamePasswordCredentials; 
import org.apache.commons.httpclient.auth.AuthScope; 
import org.apache.commons.httpclient.methods.InputStreamRequestEntity; 
import org.apache.commons.httpclient.methods.RequestEntity; 
import org.apache.jackrabbit.webdav.client.methods.PutMethod; 

... 

// WebDAV URL: 
final String baseUrl = ...; 
// Source file to upload: 
File f = ...; 
try{ 
    HttpClient client = new HttpClient(); 
    Credentials creds = new UsernamePasswordCredentials("username", "password"); 
    client.getState().setCredentials(AuthScope.ANY, creds); 

    PutMethod method = new PutMethod(baseUrl + "/" + f.getName()); 
    RequestEntity requestEntity = new InputStreamRequestEntity(
     new FileInputStream(f)); 
    method.setRequestEntity(requestEntity); 
    client.executeMethod(method); 
    System.out.println(method.getStatusCode() + " " + method.getStatusText()); 
} 
catch(HttpException ex){ 
    // Handle Exception 
} 
catch(IOException ex){ 
    // Handle Exception 
} 
+0

Próbowałem i próbowałem uzyskać kod, który opublikowałeś. To nie spowodowało końca żalu z Tomcat. Nasz serwer WebDAV bazuje na Jackrabbit, więc naprawdę chciałem, żeby to działało. –

+0

Dzięki! Pomógł mi z serwerem Oracle Webdav (w przeciwieństwie do Sardynki). –