2016-06-10 21 views
0

Ich habe eine Anforderung zu erlauben, Benutzer Serverpfad und Dateiname und Download-Datei eingeben.
verwenden ich den folgenden Code, um den Zweck zu dienen:OAF - Datei vom Server herunterladen

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

Das Problem dabei ist, dass jede Datei größer als 48 KB, wenn heruntergeladen eine zusätzliche Zeile in ihm anhängt.

Die im Developer's Guide erwähnte Methode zur Verwendung des Objekts messageDownload ist nicht klar genug. Es erwähnt eine VO. Was sollte die Abfrage dieser VO sein? Wie fügen wir eine Datei in diese Tabelle ein, um in dieser VO verwendet zu werden?

Bitte schlagen Sie eine Lösung vor.

Antwort

0

Ich löste schließlich meine Abfrage.
Ich habe MessageDownload Bean verwendet, um den Zweck zu dienen.

  1. Wenn die Datei nirgendwo in der Datenbank gespeichert ist, erstellen Sie eine neue LOB-Tabelle. Andernfalls kann die vorhandene LOB-Tabelle verwendet werden und nur der 3. Schritt benötigt wird. erstellen LOB Tabelle:
> 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. , nun die Datei in diese LOB-Tabelle einzufügen, habe ich ein Verfahren, das ich in OAF Seite nannte sich. Beachten Sie, dass das in der Funktion BILENAME verwendete Verzeichnis ein vorhandenes Verzeichnis in all_directories oder dba_directories sein muss.
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. nun in OAF Seite, fügen Sie messageDownload Artikel und geben Sie die folgende Liste:
    anzeigen Beispiel: VO mit Abfrage für LOB Tabelle
    anzeigen Attribut: VO Attribut mit Dateiname
    MIME-Typ: Entweder fest codieren zu 'Text/html' oder dynamisch machen wie in DevGuide
    Dateiansicht Attr: VO Attribut mit Dateidaten
    Datentyp: CLOB

Ich habe ein Eingabefeld für Dateipfad und Dateiname hinzugefügt. Klicken Sie dann auf GO, wird die Prozedur Schritt 2 aufgerufen und die Nachricht Download-Element VO wird entsprechend ausgeführt.

Bitte lassen Sie mich wissen, im Falle von Fragen.