5

我还在Liferay 社区板上发布了这个问题。

我正在尝试通过网络服务访问 Liferay 的文档库。为此,我使用 Eclipse 从 Liferay 的 Portlet_DL_DLAppService wsdl 创建了一个 Web 客户端。一切顺利,我想我可以轻松地远程创建一个文件,但是生成的类似乎没有任何功能来读回文件的内容。

DLAppService具有获取FileEntries的方法,但是虽然接口 FileEntry 具有方法 getContentStream(),但生成的 Web 客户端 (FileEntrySoap) 中的代理类没有。

我觉得我从根本上错过了一些东西,因为我认为我不是第一个通过 Web 服务使用 Liferay 文档库的人?

欢迎任何提示或指示。

4

3 回答 3

5

另一种解决方法是使用 http 请求获取文件。

以下示例使用 Apache commons-httpclient (v4) 和基本身份验证。如果客人有权查看文件,则不需要身份验证部分。

对于基本身份验证,您需要 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 并调用该方法

于 2012-11-21T21:04:54.030 回答
3

在浏览了他们的网站很长一段时间后 - 我终于在论坛上看到了你的帖子,然后是这个,较旧的:

http://www.liferay.com/community/forums/-/message_boards/message/7943515

一般来说,看起来该服务根本没有提供大量文档,更不用说这个特定的功能子集了。

但是 - 按照这些链接,我找到了一些可能有帮助的资源:

使用 Liferay Portal 作为内容管理系统开始使用文档和媒体

如您所见,这两个链接位于用户指南中。

看起来您可以从文档和媒体门户页面获取文档的 WebDAV URL - 这可能反映了非 API 方式来执行 Olaf 在通过 API 的回答中建议的方式。

我很好奇上述任何一个答案是否有助于您解决问题,因为两者都没有被标记为正确 - 但由于赏金,我猜不是。我希望这些资源有所帮助。

于 2012-11-26T18:05:37.727 回答
1

抱歉,我现在无法提供完整的解决方案,但如果其他一切都失败了,您可以尝试通过 WebDAV 使用解决方法:DLUtil.getWebDavURL()

InputStream 是不好通过 SOAP 传输的东西,但是如果你只是获取一个 URL,然后通过这种方式打开文件,你很可能能够得到你需要的东西。这也将使您能够更新文件。

那里可能有一堆 WebDAV 实现 - 取决于您需要从中访问 doclib 的环境(编程语言)。

于 2012-11-21T13:31:21.833 回答