Java Webdav文件同步



我有一个云存储层,即hidrive。它使用webdav协议。注意,它是基于HTTP的。他们提供的客户端应用程序很差,而且有很多bug,所以我尝试了各种其他的同步工具,但没有一个能按我需要的方式工作。

因此,我试图在Java中使用沙丁鱼项目实现它。是否有任何代码硬拷贝本地源文件夹到外部云文件夹?我没找到那个方向的东西。

下面的代码应该上传文件…

Sardine sardine = SardineFactory.begin("username", "password");
InputStream fis = new FileInputStream(new File("some/file/test.txt"));
sardine.put("https://webdav.hidrive.strato.com/users/username/Backup", fis);

…但是会抛出一个异常:

Exception in thread "main" com.github.sardine.impl.SardineException: Unexpected response (301 Moved Permanently)
    at com.github.sardine.impl.handler.ValidatingResponseHandler.validateResponse(ValidatingResponseHandler.java:48)
    at com.github.sardine.impl.handler.VoidResponseHandler.handleResponse(VoidResponseHandler.java:34)
    at com.github.sardine.impl.handler.VoidResponseHandler.handleResponse(VoidResponseHandler.java:1)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:218)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
    at com.github.sardine.impl.SardineImpl.execute(SardineImpl.java:828)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:755)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:738)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:726)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:696)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:689)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:682)
    at com.github.sardine.impl.SardineImpl.put(SardineImpl.java:676)

打印出该目录下的文件夹工作,因此连接/身份验证成功:

List<DavResource> resources = sardine.list("https://webdav.hidrive.strato.com/users/username/Backup");
for (DavResource res : resources)
{
    System.out.println(res);
}

请帮助我修复我的代码或链接我到一些文件同步库,为我的目的工作

Sardine使用(内部)HttpClient。这里有类似的问题,您可以找到答案Httpclient 4,错误302。.

在调用put()之前尝试将InputStream对象j转换为字节数组。像下面这样,

byte[] fisByte = IOUtils.toByteArray(fis);
sardine.put("https://webdav.hidrive.strato.com/users/username/Backup", fisByte);

它对我有效。让我知道。

我必须扩展"org.apache.http.impl.client "。以及org.apache.http. imp.client . defaultredirectstrategy的getRedirect()方法,并对所需的方法进行处理:PUT、MKOL等。默认情况下只重定向GET。

它看起来像这样:

private static final String[] REDIRECT_METHODS = new String[] {HttpGet。METHOD_NAME HttpPost。METHOD_NAME HttpHead。METHOD_NAME HttpPut。METHOD_NAME HttpDelete。METHOD_NAME HttpMkCol。METHOD_NAME};

isRedirectable-Method

for (final String m : REDIRECT_METHODS) {
  if (m.equalsIgnoreCase(method)) {
    System.out.println("isRedirectable true");
    return true;
  }
}
return method.equalsIgnoreCase(HttpPropFind.METHOD_NAME);

getRedirect-Method:

final URI uri = getLocationURI(request, response, context);
final String method = request.getRequestLine().getMethod();
if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
  return new HttpHead(uri);
} else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
  return new HttpGet(uri);
} else if (method.equalsIgnoreCase(HttpPut.METHOD_NAME)) {
  HttpPut httpPut = new HttpPut(uri);
  httpPut.setEntity(((HttpEntityEnclosingRequest) request).getEntity());
  return httpPut;
} else if (method.equalsIgnoreCase("MKCOL")) {
  return new HttpMkCol(uri);
} else if (method.equalsIgnoreCase("DELETE")) {
  return new HttpDelete(uri);
} else {
  final int status = response.getStatusLine().getStatusCode();
  if (status == HttpStatus.SC_TEMPORARY_REDIRECT) {
    return RequestBuilder.copy(request).setUri(uri).build();
  } else {
    return new HttpGet(uri);
  }
}

最新更新