业务背景
在XX公司项目上,需求上传所有物料的图片、技术图纸和作业说明书等等文件,由于Oracle EBS标准附件上传功能文件都是保存在数据表FND_LOBS中,当上传的文件数量大的时候,日常生产经常需要在线浏览或下载,担心影响数据库性能,领导要求开发类似于附件功能上传的文件保存在服务器某些文件夹中。
前提条件
Java编程基础
OAF上传代码
上传核心代码如下:
1.创建文件流出输类:fileOutput.java,用于上传文件流保存服务器某文件夹中。
package oracle.apps.cux.attachment.webui;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.FileOutputStream;
import oracle.jbo.domain.BlobDomain;
public class fileOutput
{
public fileOutput()
{
}
/**文件流保存至指定的路径和文件名
*@param fileStream 上传文件流
*@param filePath 文件保存的目录
*@param fileName 保存的文件名称
*/
public void initFile(BlobDomain fileStream, String filePath,String fileName)
{
File directory = new File(filePath);
if (!directory.exists())
directory.mkdirs();
File file = new File(directory, fileName);
try {
fromInputToOutput(fileStream.getBinaryStream(),
new FileOutputStream(file));
} catch (Exception exception) {
exception.printStackTrace();
}
}
public void fromInputToOutput(InputStream inputstream,
OutputStream outputstream) throws IOException {
int bytesWritten = 0;
int byteCount =0;
byte[] buf = new byte[1024 * 8];
while(true){
int read = 0;
if (inputstream != null) {
read = inputstream.read(buf);
}
if (read == -1) {
break;
}
System.out.println("read=" + read);
outputstream.write(buf, 0, read);
}
inputstream.close();
outputstream.close();
}
}
2.上传文件CO类:UploadFileCO.java
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean){
super.processFormRequest(pageContext, webBean);
if(pageContext.getParameter("Submit")!=null){
String AccessID = pageContext.getParameter("access_id");
String FileID=pageContext.getParameter("FileID");
String serverPath=pageContext.getParameter("serverPath");
String fileName = null;
String contentType = null;
BlobDomain uploadedByteStream = null;
//获得OAF界面上messageFileUpload组件的文件数据对象
DataObject fileUploadData =(DataObject)pageContext.getNamedDataObject("uploadfile");
//获得上传文件名
fileName = (String)fileUploadData.selectValue(null, "UPLOAD_FILE_NAME");
//获得上传文件上下文类型
contentType =(String)fileUploadData.selectValue(null, "UPLOAD_FILE_MIME_TYPE");
//获得上传文件流
uploadedByteStream = (BlobDomain)fileUploadData.selectValue(null, fileName);
fileOutput fileOT=new fileOutput();
try{
//上传文件流保存到指定的目录和文件名
fileOT.initFile(uploadedByteStream,serverPath,fileName);
/*省略对数据表的操作代码*/
}catch(Exception ex){
throw new OAException("Upload file failure,please a select file."+ex.getMessage(), OAException.INFORMATION);
}
}
}
OAF下载代码
参考代码如下:
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
String FileID=pageContext.getParameter("FileID");
Row row=null;
OAApplicationModule am = pageContext.getApplicationModule(webBean);
OAViewObject vo = (OAViewObject)am.findViewObject("CUXFndLobsVO1");
//pathFile="FILE_NAME= '/test/uat/apps/apps_st/appl/ap/12.0.0/help/US/" + fileName+ "'";
vo.setWhereClause("FILE_ID="+FileID);
vo.executeQuery();
row=vo.next();
if(row!=null){
String filedownload = (String)row.getAttribute("FileName");
String contentType=(String)row.getAttribute("FileContentType");
File file=new File(filedownload);
DataObject dataobject = pageContext.getNamedDataObject("_SessionParameters");
HttpServletResponse response = (HttpServletResponse)dataobject.selectValue(null, "HttpServletResponse");
response.setContentType("application/x-download");
//String filedownload = "C:\\Download\\test.jpg";//即将下载的文件的绝对路径
String filedisplay = file.getName();//"AP00007726.htm";//下载文件时显示的文件保存名称
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
OutputStream outp = null;
FileInputStream in = null;
try{
outp = response.getOutputStream();
in = new FileInputStream(filedownload);
byte[] b = new byte[1024];
int i = 0;
while((i = in.read(b)) > 0){
outp.write(b, 0, i);
}
outp.flush();
in.close();
outp.close();
}catch(IOException e){
System.out.println("Error!");
e.printStackTrace();
}
}
}
异常问题:中文文件名乱码
通常用中文命名文件名称,上传到Oracle EBS应用层服器上指定目录文件名变成乱码,非常头疼的问题。目前,解决方法将文件名转换成数字或英文名称,下载时候再将其转换成当前上传的文件名。