我也发布了这个问题on the Liferay community board。
我正试图通过网络服务访问Liferay的文档库。为此,我使用Eclipse从Liferay的Portlet_DL_DLAppService wsdl创建了一个Web客户端。一切顺利,我认为我可以轻松地远程创建文件,但生成的类似乎没有任何功能来回读文件的内容。
DLAppService有获取FileEntries的方法,但是接口FileEntry有方法getContentStream(),但生成的Web客户端(FileEntrySoap)中的代理类没有。
我觉得我从根本上缺少一些东西,因为我认为我不是第一个通过网络服务使用Liferay文档库的人?
欢迎使用任何提示或指针。
答案 0 :(得分:5)
另一种解决方法是使用http请求获取文件。
以下示例使用Apache commons-httpclient(v4)和基本身份验证。如果guest有权查看文件,则不需要身份验证部分。
对于基本身份验证,您需要com.liferay.portal.security.auth.BasicAuthHeaderAutoLogin
作为auto.login.hooks
属性中的一个登录挂钩(在portal-ext.properties中)
实施例
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
private static byte[] getFile(inal long groupId, final long folderId, final String title, final String hostname, final int port, final String username, final String password) throws ClientProtocolException, IOException {
final DefaultHttpClient httpclient = new DefaultHttpClient();
try {
final String filename = URLEncoder.encode(title);
final HttpHost targetHost = new HttpHost(hostname, port);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
final AuthScope authscope = new AuthScope(targetHost.getHostName(), targetHost.getPort());
httpclient.getCredentialsProvider().setCredentials(authscope, creds);
final AuthCache authCache = new BasicAuthCache();
final BasicScheme basicAuth = new BasicScheme();
authCache.put(targetHost, basicAuth);
final BasicHttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.AUTH_CACHE, authCache);
final HttpGet httpget = new HttpGet("/documents/" + groupId + "/" + folderId + "/" + filename);
final HttpResponse response = httpclient.execute(targetHost, httpget, localContext);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
final HttpEntity entity = response.getEntity();
if (entity != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
entity.writeTo(baos);
return baos.toByteArray();
}
}
return null;
} finally {
httpclient.getConnectionManager().shutdown();
}
}
从您从Web服务获得的FileEntry,您可以获取groupId,folderId和title并调用方法
答案 1 :(得分:3)
经过他们的网站挖掘了一段时间后 - 我终于遇到了你在论坛中的帖子,然后是这个,旧的:
http://www.liferay.com/community/forums/-/message_boards/message/7943515
一般来说,服务似乎根本不提供大量文档,更不用说这个特定的功能子集了。
然而 - 在这些链接之后,我找到了一些可能有用的资源:
Using Liferay Portal as a content management system和 Getting Started with the Documents and Media
如您所见,这两个链接位于用户指南中。
看起来您可以从 Documents and Media 门户页面获取文档的WebDAV URL - 这可能反映了Olaf在他的回答中建议的非API方式API。
我很好奇上述答案中的任何一个是否有助于你解决问题,因为两者都没有被标记为正确 - 但我猜不是因为Bounty。我希望这些资源有所帮助。
答案 2 :(得分:1)
很抱歉,我现在无法提供完整的解决方案,但如果其他一切都失败了,您可以尝试通过WebDAV使用解决方法:DLUtil.getWebDavURL()
InputStream不适合通过SOAP传输,但如果你只是获取一个URL,然后通过这种方式打开文件,你很可能会得到你需要的东西。这也可以让您更新文件。
可能有很多WebDAV实现 - 取决于从中访问doclib所需的环境(编程语言)。