1

現在の状況: Java コードでは、Ektorp ライブラリを介して CouchDB から添付ファイル付きのドキュメントを取得しています。これらのドキュメントは Java オブジェクトにマップされ、すべて正常に機能します。ブラウザーでこれらの添付ファイルにアクセスできるようにするために、バイト配列としてのドキュメントの添付ファイル、コンテンツ タイプ、およびファイル名を使用して ByteArrayResource をインスタンス化しています。

private ByteArrayResource handleAttachment(String key, String cType) {
    ByteArrayResource res = null;
    AttachmentInputStream attIS = CouchDB.INSTANCE.getCouchDbConnector().getAttachment(doc.getId(), key);
    InputStream is = new BufferedInputStream(attIS);
    try {
        // Convert InputStream to byte[] with Apache commons-io
        byte[] bytes = IOUtils.toByteArray(is);
        attIS.close();
        is.close();
        res = new ByteArrayResource(cType, bytes, key);
    } catch (IOException e) {
        logger.error("", e);
    }
    return res;
}

次に、自分のページに ResourceLink を追加するだけです。

ByteArrayResource resource = handleAttachment(key, cType);
add(new ResourceLink("resLink", resource));

問題は、ブラウザでそのリンクをクリックすると、コンテンツ タイプに関係なく、すべての添付ファイルがダウンロードされることです。ブラウザー経由で CouchDB からこれらの添付ファイルに直接アクセスすると、"image/xxx" コンテンツ タイプがブラウザーで画像を開き、"text/xxx" がブラウザーに表示され、"application/pdf" も処理されます。ブラウザーによって (Safari などで PDF がすぐに表示されます)。

Wicketでそれを達成するにはどうすればよいですか? どんな助けでも大歓迎です。私のサイトは保護されているため、共有リソースは必要ありません。ありがとうございました!

PS: 興味深いのは、「rel="prettyPhoto" 属性を持つ「画像」コンテンツ タイプの ResourceLinks の 1 つを開くと、JQuery PrettyPhoto プラグインを取得して、その画像をレイオーバーで正しく表示することです。ただし、ブラウザーは a をトリガーします。ダウンロード。

4

2 に答える 2

0

ファイル名情報を保持したい場合は、次のように ByteArrayResource のメソッド newResourceResponse をオーバーライドしてみてください。

res = new ByteArrayResource(cType, bytes, key){
  @Override
  protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes){
    AbstractResource.ResourceResponse rr = super.newResourceResponse(attributes)
    rr.setContentDisposition(ContentDisposition.INLINE);
    return rr;
  }
};

このようにして、手動でレスポンスをインラインにすることができます。

于 2012-08-05T22:15:27.857 に答える
0

ファイル名も入力する ByteArrayResource のコンストラクター バージョンを使用しているようです (コードの 3 番目のパラメーター 'key' です)。そうすることで、ByteArrayResource は応答を「ATTACHMENT」として構成するため、常に保存ダイアログが表示されます。key パラメータを省略して、目的の動作が得られるかどうかを確認してください。

于 2012-08-05T13:43:25.150 に答える