OAF - Скачать файл с сервера

У меня есть требование разрешить пользователю вводить путь к серверу и имя файла и загружать файл.
Для этой цели я использовал приведенный ниже код:

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();
    }
  }

Проблема в том, что любой файл размером более 48 КБ при загрузке добавляет в него дополнительную строку.

Метод использования элемента messageDownload, упомянутый в руководстве разработчика, недостаточно ясен. Там упоминается ВО. Каким должен быть запрос этого ВО? Как вставить файл в эту таблицу для использования в этом ВО?

Пожалуйста, предложите решение.


person RaniVerma    schedule 10.06.2016    source источник


Ответы (1)


Наконец-то я разрешил свой запрос.
Для этой цели я использовал messageDownload Bean.

  1. Если файл нигде не хранится в БД, создайте новую таблицу LOB. В противном случае можно использовать существующую таблицу LOB, и потребуется только 3-й шаг. Создайте LOB-таблицу:
> 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.
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 и укажите следующее:
    Экземпляр представления: VO с запросом таблицы LOB
    Атрибут представления: Атрибут VO с именем файла
    Тип MIME: либо жестко запрограммируйте его на ' text/html» или сделать его динамическим, как в DevGuide
    Атрибут представления файла: VO Атрибут, содержащий данные файла
    Тип данных: CLOB

Я добавил поле ввода для пути к файлу и имени файла. Затем, при нажатии на кнопку GO, вызывается процедура шага 2, и соответственно выполняется сообщение Download item VO.

Пожалуйста, дайте мне знать, в случае каких-либо вопросов.

person RaniVerma    schedule 16.06.2016