2

ここでは、特定のdocxファイルをダウンロードすることになっているAlfrescoExplorerでのアクション用の特定のダイアログBeanを追加しようとしています。ダウンロードアクションを実行すると、コードは正常に機能します。ファイルがダウンロードされますが、質問のタイトルに記載されているように、ファイルサイズは0バイトです。

私はそれを行うためにこれを使用しています:

public class NewFormDialog extends BaseDialogBean {

protected String aspect;

protected String finishImpl(FacesContext context, String outcome)
        throws Exception {

    download(aspect);

    // // get the space the action will apply to
    // NodeRef nodeRef = this.browseBean.getActionSpace().getNodeRef();
    //
    // // resolve the fully qualified aspect name
    // QName aspectToAdd = Repository.resolveToQName(this.aspect);
    //
    // // add the aspect to the space
    // getNodeService().addAspect(nodeRef, aspectToAdd, null);
    //
    // // return the default outcome
    return outcome;
}

public boolean getFinishButtonDisabled() {
    return false;
}

public String getFinishButtonLabel() {
    return "Download";
}

public void download(String pAspect) throws ServletException, IOException {

    String filename = pAspect;
    String filepath = "\\";
    BufferedInputStream buf = null;
    ServletOutputStream myOut = null;

    try {
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) fc
                .getExternalContext().getResponse();

        myOut = response.getOutputStream();
        File myfile = new File(filepath + filename);

        // set response headers
        response.setContentType("application/octet-stream");

        response.addHeader("Content-Disposition", "attachment; filename="
                + filename);

        response.setContentLength((int) myfile.length());

        FileInputStream input = new FileInputStream(myfile);
        buf = new BufferedInputStream(input);
        int readBytes = 0;

        // read from the file; write to the ServletOutputStream
        while ((readBytes = buf.read()) != -1)
            myOut.write(readBytes);
        myOut.flush();
        response.flushBuffer();

    } catch (IOException ioe) {

        throw new ServletException(ioe.getMessage());

    } finally {
        // close the input/output streams
        if (myOut != null)
            myOut.close();
        if (buf != null)
            buf.close();
        FacesContext.getCurrentInstance().responseComplete();
    }
}

public String getAspect() {
    return aspect;
}

public void setAspect(String aspect) {
    this.aspect = aspect;
}
}

私は、どれもうまくいかないことで見つけたすべての解決策を試しました。

前もって感謝します。

4

1 に答える 1

2

ファイルが存在しない場合、メソッドFile.length()は戻ります。0ファイルが存在することを確認してください。

ヒント:Apache Commons IOライブラリは、多くのI/O関連タスクを簡素化します。たとえば、次のコードスニペットは、ファイルの内容をサーブレットの応答にストリーミングします。

HttpServletResponse response = ...
File myfile = ...
InputStream in = null;
OutputStream out = null;
try {
  in = new FileInputStream(myfile);
  out = response.getOutputStream();
  IOUtils.copy(in, out);
} finally {
  IOUtils.closeQuietly(in); //checks for null
  IOUtils.closeQuietly(out); //checks for null
}
于 2012-06-01T14:32:36.237 に答える