5

この質問はLiferayコミュニティボードにも投稿しました。

Webサービスを介してLiferayのドキュメントライブラリにアクセスしようとしています。これを行うために、Eclipseを使用してLiferayのPortlet_DL_DLAppServicewsdlからWebクライアントを作成しました。すべてうまくいき、リモートで簡単にファイルを作成できると思いますが、生成されたクラスには、ファイルの内容を読み戻す機能がないようです。

DLAppServiceにはFileEntriesを取得するメソッドがありますが、インターフェイスFileEntryにはメソッドgetContentStream()がありますが、生成されたWebクライアント(FileEntrySoap)のプロキシクラスにはありません。

私は、Webサービスを介してLiferayのドキュメントライブラリを使用する最初の人ではないと思うので、根本的に何かが欠けているように感じますか?

ヒントやポインタは大歓迎です。

4

3 に答える 3

5

別の回避策は、httpリクエストでファイルを取得することです。

次の例は、基本認証でApache commons-httpclient(v4)を使用しています。ゲストがファイルを表示する権限を持っている場合、認証部分は必要ありません。

基本認証の場合、プロパティ(portal-ext.properties内)com.liferay.portal.security.auth.BasicAuthHeaderAutoLoginのログインフックの1つとして必要 になりますauto.login.hooks

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ポータルをコンテンツ管理システムとして使用、ドキュメントとメディアの使用を開始する

ご覧のとおり、2つのリンクはユーザーガイド内にあります。

ドキュメントとメディアポータルページからドキュメントのWebDAVURLを取得できるようです。これは、OlafがAPIを介して回答で提案したことを実行する非APIの方法を反映している可能性があります。

どちらも正しいとマークされていないので、上記の答えのどちらかが問題の解決に役立ったかどうか知りたいのですが、バウンティのためにそうではないと思います。これらのリソースがお役に立てば幸いです。

于 2012-11-26T18:05:37.727 に答える
1

申し訳ありませんが、現在完全なソリューションを提供することはできませんが、他のすべてが失敗した場合は、WebDAVを介して回避策を使用してみてください:DLUtil.getWebDavURL()

InputStreamは、SOAPを介して転送するのは適切ではありませんが、URLを取得してからこの方法でファイルを開くと、必要なものを取得できる可能性が高くなります。これにより、ファイルを更新することもできます。

おそらくそこにはたくさんのWebDAV実装があります-doclibにアクセスする必要のある環境(プログラミング言語)によって異なります。

于 2012-11-21T13:31:21.833 に答える