OAF - 从服务器下载文件
OAF - Download file from server
我有一个要求允许用户输入服务器路径和文件名并下载文件。
我使用以下代码来达到目的:
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的查询应该是什么?我们如何在此 table 中插入文件以用于此 VO?
请提出解决方案。
我终于解决了我的问题。
我使用了messageDownload Bean来达到目的。
- 如果文件未存储在数据库中的任何位置,则创建一个新的 LOB table。否则,可以使用现有的 LOB table 并且只需要第 3 步。
创建 LOB table:
> 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 table,我使用了一个在 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 table
查看属性:具有文件名的 VO 属性
MIME 类型:将其硬编码为 'text/html' 或像 DevGuide
中那样使其动态化
文件视图属性:具有文件数据的 VO 属性
数据类型:CLOB
我添加了文件路径和文件名的输入字段。然后,点击 GO 按钮,调用步骤 2 Procedure 并相应地执行 messageDownload 项目 VO。
如有任何疑问,请告诉我。
我有一个要求允许用户输入服务器路径和文件名并下载文件。
我使用以下代码来达到目的:
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的查询应该是什么?我们如何在此 table 中插入文件以用于此 VO?
请提出解决方案。
我终于解决了我的问题。
我使用了messageDownload Bean来达到目的。
- 如果文件未存储在数据库中的任何位置,则创建一个新的 LOB table。否则,可以使用现有的 LOB table 并且只需要第 3 步。 创建 LOB table:
> 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 table,我使用了一个在 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 table
查看属性:具有文件名的 VO 属性
MIME 类型:将其硬编码为 'text/html' 或像 DevGuide
中那样使其动态化 文件视图属性:具有文件数据的 VO 属性
数据类型:CLOB
我添加了文件路径和文件名的输入字段。然后,点击 GO 按钮,调用步骤 2 Procedure 并相应地执行 messageDownload 项目 VO。
如有任何疑问,请告诉我。