2

サーバー上のファイル (Web では利用できない) を読み取り、それをダウンロード可能なファイルとしてユーザーに出力する必要があります。

シナリオは

  1. ユーザーが XPage からリンクをクリックする
  2. リクエストはサーバーに送信され、サーバーはサーバー ファイル システム内の定義済みファイルを読み取ります。
  3. ファイルは、Web ブラウザでダウンロード可能なファイルとしてユーザーに返されます。

サーバー上のファイルは、.pdf、.exe、.doc などの任意の形式にすることができます。

これが SSJS で行われるか Java で行われるかは問題ではありません。

私は本当にいくつかのコードを高く評価します

4

2 に答える 2

3

ここに同様の質問があります:

xPages からファイルをストリーミングするには?

そして、ここにあるのは、そこから取得して私が完成させた Java コードの一部です (+ あなたからの修正!)。私も今それをテストしましたが、動作します:

FacesContext facesContext = FacesContext.getCurrentInstance();
XspHttpServletResponse  response = (XspHttpServletResponse) facesContext.getExternalContext().getResponse();

String strFileName = "myfile.txt";
String strFilePath= "c:" + File.separator + strFileName;
response.setContentType(URLConnection.guessContentTypeFromName(strFileName));
response.setHeader("Content-Disposition","attachment;filename=" + strFileName);

//File file = new File(strFilePath);
FileInputStream fileIn = new FileInputStream(strFilePath);
ServletOutputStream out = response.getOutputStream();

int iLen = 0;
byte[] btBuffer = new byte[10240];  // Not sure about optimal buffer size
while ((iLen = fileIn.read(btBuffer)) != -1) {
  out.write(btBuffer, 0, iLen);
}

facesContext.responseComplete();
out.close();

これらすべてを SSJS でも行うことができます。

guessContentTypeFromName推測できない場合は、サーバー上の定義ファイルを変更する必要があります。または、ファイル タイプのセットが限られている場合は、MIME タイプ テーブルをコード/アプリケーションに配置できます。

于 2013-02-11T19:39:33.427 に答える
0

これを行うために私が思いついたコードは次のとおりです。本番コードではありません。

    public static byte[] grabFile(String readFile) throws IOException {

        File file = new File(readFile);
        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        InputStream ios = new FileInputStream(file);

        try {
            byte []buffer = new byte[4096];

            int read = 0;
            while ( (read = ios.read(buffer)) != -1 ) {
                ous.write(buffer, 0, read);
            }
        } finally { 
            try {
                 if ( ous != null ) 
                     ous.close();
            } catch ( IOException e) {
            }

            try {
                 if ( ios != null ) 
                      ios.close();
            } catch ( IOException e) {
            }
        }
        return ous.toByteArray();
    }

 public static void download() throws IOException {
        byte[] data = grabFile("\\\\server\\path\\to\\file.pdf");
        HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        response.reset(); 
        response.setContentType("application/pdf"); 
        response.setHeader("Content-disposition", "attachment; filename=\"filename.pdf\"");
        OutputStream output = response.getOutputStream();
        output.write(data);
        output.close();
        FacesContext.getCurrentInstance().responseComplete(); 
    }

次に、Xpage の beforeRenderResponse からダウンロード メソッドを呼び出すだけです。

于 2013-02-12T15:23:04.450 に答える