2016-06-10 146 views
0

我有一個要求,允許用戶輸入服務器路徑和文件名並下載文件。
我用下面的代碼爲服務宗旨: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(); 
    } 
    } 

的問題與此是,超過48KB更大的任何文件,下載時附加在其中一個額外的行。

使用開發人員指南中提到的messageDownload項目的方法不夠清楚。它提到了一個VO。什麼應該是這個VO的查詢?我們如何在此表中插入文件以用於此VO?

請提出解決方案。

回答

0

我終於解決了我的查詢。
我已經使用messageDownload Bean來達到目的。

  1. 如果文件未存儲在數據庫中的任何位置,則創建一個新的LOB表。否則,可以使用現有的LOB表,只需要第三步。 創建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 
>     ) 
>  ) ; 
  • 現在,爲了將文件插入此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; 
    
  • 現在,在OAF頁上,添加messageDownload項並指定以下:
    查看實例:VO與查詢LOB表
    查看屬性:VO屬性文件名
    MIME類型:可以將其硬編碼爲'text/html'或使其成爲動態的數據類型:CLOB
  • 我已經爲文件路徑和文件名添加了輸入字段。然後,點擊GO按鈕,調用第2步程序,並相應地執行messageDownload項目VO。

    請讓我知道,如有任何疑問。