我在strato有一个云存储,即hidrive。它使用webdav协议。请注意,它基于HTTP。他们提供的client application很差且有问题,所以我尝试了各种其他工具进行同步,但没有一种工具按我需要的方式工作。
因此我尝试使用Sardine项目在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);
}
请帮我修改我的代码或将我链接到一些适合我目的的文件同步库。
答案 0 :(得分:0)
沙丁鱼使用(内部)HttpClient。这里有类似的问题,您可以在其中找到答案Httpclient 4, error 302. How to redirect?。
答案 1 :(得分:0)
在调用put()之前,尝试将InputStream obj转换为字节数组。像下面的东西,
byte[] fisByte = IOUtils.toByteArray(fis);
sardine.put("https://webdav.hidrive.strato.com/users/username/Backup", fisByte);
它对我有用。让我知道。
答案 2 :(得分:0)
我必须扩展“org.apache.http.impl.client.LaxRedirectStrategy”以及org.apache.http.impl.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-方法
for (final String m : REDIRECT_METHODS) {
if (m.equalsIgnoreCase(method)) {
System.out.println("isRedirectable true");
return true;
}
}
return method.equalsIgnoreCase(HttpPropFind.METHOD_NAME);
getRedirect-方法:
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);
}
}
这对我有用。