0

添付ファイルでダウンロードして提供するのではなく、MSドキュメントをインラインで提供したい。ドキュメントタイプに従ってアプリケーションのmimeタイプを定義しましたが、クライアントはそれをダウンロードしようとします。これが私のコードです:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream is = null;
    String fileName = "file.docx";

    try {
        java.io.File file = new java.io.File("C:/"+fileName);

        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        byte[] bytes = new byte[in.available()];
        in.read(bytes);
        in.close();

        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.addHeader("Content-Disposition", "inline;filename=\"" + fileName + "\"");

        response.getOutputStream().write(bytes);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

これはどのように発生し、どうすれば解決できますか?

4

3 に答える 3

1

これを可能にするクライアント側のプラグインがない限り、未加工の MS ドキュメントをページ内にレンダリングすることはできません (Flash がビデオやゲームに提供するものと同様)。私はそのようなプラグインを認識していません。おそらく、ドキュメントを HTML に変換し、それをクライアントに書き戻す必要があります。

于 2012-04-15T18:11:22.493 に答える
0

HTMLタグを使用しobjectてMS-WordまたはExcelドキュメントをHTMLページに埋め込む方法があると思いますが、Windowsでも、異なるブラウザ間でどの程度移植できるかわかりません。また、HTML フレームをページの特定の領域に制限しておく必要があるかもしれません。

それが望ましくない場合は、何らかのライブラリを使用して自分で変換するか、ScribdSlideshareのような API を使用してドキュメントをアップロードし (MS 形式でも)、埋め込み可能なスニペットを取得することができます。ただし、データはサービスによってホストされています。

于 2012-04-15T18:33:36.480 に答える
0

少なくとも Internet Explorer では、ユーザーは性質を上書きできます。テストに使用したブラウザはどれですか?

出力ストリームに書き込むデータin.available()は、ファイルサイズよりも小さい可能性があるため、不完全である可能性があります。InputStream の JavaDoc から

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる推定バイト数を返します。

ブロック全体を読み取りたい場合は、ファイル オブジェクトのファイル サイズを使用します。また、クライアントにファイルのサイズを伝えることもお勧めします。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream is = null;
    String fileName = "file.docx";
    BufferedInputStream in = null;

    try {
        java.io.File file = new java.io.File("C:/"+fileName);
        // not the best way
        int length = (int)file.length();

        in = new BufferedInputStream(new FileInputStream(file));
        // may allocate a huge ammout of memory
        byte[] bytes = new byte[length];
        in.read(bytes);
        in.close();
        in = null;

        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.addHeader("Content-Disposition", String.format("inline; filename=\"%s\" ; size=\"%d\"", fileName, length));

        response.getOutputStream().write(bytes);
        response.getOutputStream().flush();

    } catch (Exception e) {
        e.printStackTrace();
        throw new ServletException(e);
    } finally { 
       if (in != null) {
          try {
             in.close();
          } catch (IOException e) {
              e.printStackTrace();
              // ignore 
          }
       }
    }

}
于 2012-04-15T18:54:46.403 に答える