OAF - 从服务器下载文件

时间:2016-06-10 09:15:36

标签: oracle-adf jdeveloper oracle-apps application-framework

我要求允许用户输入服务器路径和文件名以及下载文件 我使用以下代码来达到目的:

HttpServletResponse response = (HttpServletResponse) pageContext.getRenderingContext().getServletResponse();

File fileToDownload = null;
try
{
  fileToDownload = new File(filePath);
}
catch (Exception e)
{
  throw new OAException("Invalid File Path or file does not exist.");
}

response.setContentType(fileType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setContentLength((int)fileToDownload.length());

InputStream in = null;
ServletOutputStream outs = null;

try
{
  outs = response.getOutputStream();
  in = new BufferedInputStream(new FileInputStream(fileToDownload));
  int ch;
  while ((ch = in.read()) != -1)
  {
    outs.write(ch);
  }
}catch (IOException e)
{
  // TODO
  e.printStackTrace();
}finally
  {
    try
    {
      outs.flush();
      outs.close();
      if (in != null)
      {
        in.close();
      }
    }catch (Exception e)
    {
      e.printStackTrace();
    }
  }

这个问题是,任何大于48KB的文件,在下载时都会附加一行。

使用开发人员指南中提到的使用messageDownload项目的方法还不够清楚。它提到了一个VO。该VO的查询应该是什么?我们如何在此表中插入要在此VO中使用的文件?

请提出解决方案。

1 个答案:

答案 0 :(得分:1)

我终于解决了我的疑问 我使用了messageDownload Bean来达到目的。

  1. 如果文件未存储在DB中的任何位置,则创建新的LOB表。否则,可以使用现有的LOB表,只需要第3步。 创建LOB表:
  2. > CREATE TABLE xx_LOBS (   FILE_ID            NUMBER        
    > PRIMARY KEY,   FILE_CONTENT_TYPE  VARCHAR2(100)         NOT NULL,  
    > FILE_DATA          CLOB ) LOB (FILE_DATA) STORE AS 
    >       ( TABLESPACE  APPS_TS_MEDIA 
    >         ENABLE      STORAGE IN ROW
    >         CHUNK       32768
    >         PCTVERSION  10
    >         NOCACHE
    >         STORAGE    (
    >                     INITIAL          128K
    >                     NEXT             128K
    >                     MINEXTENTS       1
    >                     MAXEXTENTS       2147483645
    >                     PCTINCREASE      0
    >                     BUFFER_POOL      DEFAULT
    >                    )
    >       ) ;
    
    1. 现在,要将文件插入此LOB表,我使用了一个我在OAF页面中调用的过程。这里要注意的是,BFILENAME函数中使用的目录必须是all_directories或dba_directories中的现有目录。
    2. CREATE OR REPLACE PROCEDURE xx_to_clob_proc (p_dir       IN VARCHAR2
                                                    , p_file_name IN VARCHAR2
                                                    , ret_code    OUT VARCHAR2
                                                    , ret_msg     OUT VARCHAR2)
          IS                                                
          v_bfile   BFILE;
          v_clob    CLOB;
      BEGIN
          v_bfile := BFILENAME (p_dir, p_file_name);
      
        BEGIN
            IF DBMS_LOB.FILEEXISTS (v_bfile) = 1 THEN
                DBMS_LOB.OPEN(v_bfile);
                DBMS_LOB.CREATETEMPORARY (v_clob, TRUE, DBMS_LOB.SESSION);
                DBMS_LOB.LOADFROMFILE (v_clob, v_bfile, DBMS_LOB.GETLENGTH (v_bfile));
                DBMS_LOB.CLOSE (v_bfile);
      
                INSERT INTO xx_LOBS VALUES(FILE_ID_SEQ.NEXTVAL,'text/html', v_clob);
      
            END IF;
            ret_code := 'S';
            ret_msg := 'File stored in LOB table';
            COMMIT;
        EXCEPTION
            when others then
                ret_code := 'E';
                ret_msg := 'Error: File not generated.' ||sqlerrm;
                rollback;
      
        END;
      
      EXCEPTION
          when others then
              ret_code := 'E';
              ret_msg := 'Error: ' ||sqlerrm;
              INSERT INTO xx_LOBS VALUES(FILE_ID_SEQ.NEXTVAL,'ERROR', EMPTY_CLOB());
              COMMIT;
      
      END;
      
      1. 现在,在OAF页面中,添加messageDownload项目并指定以下内容:
        查看实例:带有查询LOB表的VO
        查看属性:具有文件名
        的VO属性 MIME类型:要么将其硬编码为&text; html'或者像DevGuide一样使它变得动态 文件视图Attr:具有文件数据的VO属性
        数据类型:CLOB
      2. 我添加了文件路径和文件名的输入字段。然后,单击GO按钮,调用步骤2过程,并相应地执行messageDownload项目VO。

        如有任何疑问,请与我们联系。