3

これを達成するために私はほとんど助けを必要としません.私のアプリでは、ユーザーはファイルをサーバーにアップロードし、それをブロブオブジェクトとして保存することができます.

私がやっていることは、以下のコードに示されています。

サーバー側では、コンテンツを応答に入れます: (このコードは、このブログ投稿WaterTalksに基づいて実装されています)

     resp.setContentType("text/plain");
     resp.setHeader("Content-Disposition", "attachment; filename=output.txt");

     PrintWriter out = resp.getWriter();
     out.println("This is the output content");
     out.println("Probably something dynamic should go in here:::::");


PersistenceManager pm = null;
         try {
                pm = PMF.get().getPersistenceManager();
                javax.jdo.Transaction transaction = pm.currentTransaction();
                Extent e = pm.getExtent(WaterTalkFiles.class, true);
                Iterator iter = e.iterator();
                String returns = "";
                WaterTalkFiles file  =  (WaterTalkFiles)iter.next();
                Blob blob = file.getData();
                byte[] buffer = blob.getBytes();
                String s = new String(buffer);
                out.println(s);
         } catch (Exception e) {
                e.printStackTrace();
         } finally {
                if (null != pm)
                      pm.close();
         }

クライアント側で、ユーザーが表示ボタンをクリックすると、ダウンロードするのではなく、ブラウザにファイルの内容を表示したい。

私のクライアント側のコードは次のとおりです。

showfilecontentButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                   String link = "/FileUploadByWaterTalks";
                    container.add(new HTML("<a href=\"" + link + "\">ShowFile</a>"));
            }
        });

上記のコード (クライアント側のコード) は、ファイルのコンテンツを表示せず、ファイルをダウンロードしているだけです。しかし、ユーザーにダウンロードさせたくないので、コンテンツを表示したいのです。

そして、それを解決するには、ここで何かを構成する必要がありますか?

 resp.setContentType("text/plain");
 resp.setHeader("Content-Disposition", "attachment; filename=output.txt");

私の問題が何であるかを理解していただければ幸いです。これを達成するためのあなたの考えや解決策を自由に共有してください。

ありがとう。


更新しました

ここでの最初の回答に基づいて、コードの一部を変更しました。

更新されたコード セクションは次のとおりです。

    resp.setHeader("Pragma", "no-cache");



final String url = "http://127.0.0.1:8888/FileUploadByWaterTalks";
String name = "output.txt";

Anchor link1 = new Anchor(name);
RootPanel.get().add(link1);
link1.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        Frame f = new Frame(url);
        f.setSize("600px", "400px");
        f.getElement().getStyle().setBorderWidth(0, Unit.PX);
        RootPanel.get().add(f);
      }
    });

しかし、それでもブラウザ自体にファイルを表示する代わりに、ファイルを保存するように求められます。

4

1 に答える 1

6

まず、サーブレットの「Content-Disposition」を削除します。

次に、コードで GWTAnchorを使用し、ユーザーがリンクをクリックしたときに、新しいウィンドウまたは iframe でリンクを開きます。

ここに、新しいウィンドウを使用した例と、iframe を使用した別の例があります。

    final String url = "http://gwtquery.googlecode.com/git/README.txt";
    String name = "README.txt";

    Anchor link1 = new Anchor(name);
    RootPanel.get().add(link1);
    link1.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        Window.open(url, "_blank", "");
      }
    });

    Anchor link2 = new Anchor(name);
    RootPanel.get().add(link2);
    link2.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        Frame f = new Frame(url);
        f.setSize("600px", "400px");
        f.getElement().getStyle().setBorderWidth(0, Unit.PX);
        RootPanel.get().add(f);
      }
    });

このアプローチは、ブラウザが表示できるファイルであればどのファイルでも機能しますが、必ず適切なContent-Typeヘッダー (text/plain、text/html、image/png など)を送信してください。

于 2013-03-17T22:29:07.483 に答える