填报表中实现附件的上传下载
需求描述:
润乾填报表能够上传文件实现图片字段的数据库端保存,在填报表单上,如果上传图片,会对数据表里的图片字段进行更新或插入。在进行华立集团信息平台投标原型验证时,需要用填报表来实现基础信息的录入和提交入库,并需要上传相关附件。客户提出不希望在数据库中建立Blob 和 Clob类型的字段,用于存储大型字符串或二进制数据(如图片),而是把填报表中上传的附件保存在服务器指定目录,并把相应的附件名称存储在数据库中,方便系统管理员对上传附件进行备份,转移等操作。
填报首先要完成基础信息的填报,将填报表数据提交至数据库,并将附件上传至服务器指定目录。对已经填报的信息,可以进行查询,并可下载相关附件。
实现思路:
将填报的基础信息填报和附件上传下载分别进行处理:
1. 建立填报表,设置填报表的更新属性,完成填报区域和数据库字段的映射关系。
2. 利用jspSmartUpload文件上传下载组件,完成附件的服务器端上传和下载。
实现步骤:
1. 报表模板开发:
报表模板中关于填报属性及更新属性的定义不再详细描述,仅对附件上传的相关单元格作简要说明:
报表定义了参数filename用于接收从上传附件页面传递过来的上传附件名称。
C10单元格:=if(@filename!=null,@filename,ds1.FIELD1NAME)
如果filename不为空显示参数filename,否则为ds1.FIELD1NAME。
C10单元格设置了自定义填报风格,调用报表发布页面的show()和hidden()进行文件上传框的打开和关闭。
F10单元格:=if( ds1.FIELD1NAME==null&&filename==null,”请上传”,”下载”)
在filename和ds1.FIELD1NAME结果都为空的时候显示”请上传”,否则显示”下载”,单元格设置了超链接:’/jsp/fileupload/down.jsp?filename=’+C10,调用文件下载页面进行文件下载。
2. jsp页面:
a.主报表页面(报表展现页面)parent.jsp:完成报表模板发布,并定义打开上传子窗口的javascript函数
部分代码:
<script type=”text/javascript”>
function onOpenWindow(){ //打开子窗口child.jsp
var result = window.showModalDialog(“child.jsp”,window,”dialogWidth:300px;dialogHeight:100px”);
if(result != null){
window.location=”parent.jsp?filename=”+ result[0];
function show() {
onOpenWindow();
function hidden() {
//这里可添加其他处理代码
</script>
……
<report:html name=”report1″ reportFileName=”Upload.raq”
funcBarLocation=”top”
needPageMark=”yes”
params=”<%=param.toString()%>”
needSaveAsExcel=”yes”
exceptionPage=”/reportJsp/myError2.jsp”
width=”-1″
/>
b.附件上传选择页面(child.jsp),用户选择需要上传的附件,及显示上传附件的名称。
部分代码:
<body>
<form action=”uploadimage.jsp” name=”form1″ method=”post” enctype=”multipart/form-data”>
<table align=”center”><tr ><td>
<!–文件上传选择框,及上传按钮–>
<input type=”file” name=”mf”/><input type=”submit” value=”上传”/><br>
<!–显示上传的文件名称的div–>
<div id=”result” ></div>
<tr><td align=”top”>
<!–点击确定,将返回至parent.jsp并传递参数filename–>
<input type=”button” name=”Submit” value=”确定” onclick=’onOK();’ />
<input type=”button” name=”Submit” value=”取消” onclick=’javascript:form1.reset();’ /></td>
</tr></table></form>
<script type=”text/javascript”>
function onOK(){
//将显示上传的文件名称的div的值传递给parent.jsp
var runValue=new Array;
runValue[0]=document.getElementById(“result”).innerHTML;
window.returnValue = runValue;
window.close();}
</script>
</body>
c.附件上传操作页面(uploadimage.jsp),进行文件上传操作,这里限制文件类型只能为jpg,gif。
部分代码:
SmartUpload mySmartUpload =new SmartUpload();
long file_size_max=4000000;
String fileName2=”",ext=”",testvar=”";
String url=”upload/”; //应保证在根目录中有此目录的存在(也就是说需要自己建立相应的文件夹)
//初始化
mySmartUpload.initialize(pageContext);
//只允许上载此类文件
try {
mySmartUpload.setAllowedFilesList(“jpg,gif”);//此处的文件格式可以根据需要自己修改
//上载文件
mySmartUpload.upload();
} catch (Exception e){
%>
<SCRIPT language=javascript>
alert(“只允许上传.jpg和.gif类型图片文件”);
</script>
<%
try{
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);
if (myFile.isMissing()){%>
<SCRIPT language=javascript>
alert(“请先选择要上传的文件”);
</script>
<%}
else{
//String myFileName=myFile.getFileName(); //取得上载的文件的文件名
ext= myFile.getFileExt(); //取得后缀名
int file_size=myFile.getSize(); //取得文件的大小
String saveurl=”";
if(file_size<file_size_max){
//更改文件名,取得当前上传时间的毫秒数值
Calendar calendar = Calendar.getInstance();
String filename = String.valueOf(calendar.getTimeInMillis());
saveurl=application.getRealPath(“/”)+url;
saveurl+=filename+”.”+ext; //保存路径
myFile.saveAs(saveurl,SmartUpload.SAVE_PHYSICAL);
String ret=”window.opener.document.all.result.innerHTML=’”+filename+”.”+ext+”‘;”;
out.print(“<script language=javascript>” + ret + “</script>”);
%>
<SCRIPT language=javascript>
alert(“上传成功!”);
</script>
<%
}catch (Exception e){
e.printStackTrace();
d.附件下载页面(down.jsp),根据接收到的参数filename值进行服务器端文件下载。
部分代码:
String filename=request.getParameter(“filename”).toString();
SmartUpload mySmartUpload =new SmartUpload();
mySmartUpload.initialize(pageContext);
try {
mySmartUpload.downloadFile(“/upload/”+filename);
out.clear();
out=pageContext.pushBody();
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
实现效果:
1. 附件上传:
点击附件1后面的单元格弹出上传附件对话框
选择附件,并点击上传后,弹出上传成功提示,并在上传附件对话框中显示上传的附件名称。
点击确定,关闭上传附件对话框,上传的附件名称会返回给填报表。
2. 填报表查询及相关附件下载
传入公司名称参数可以查询填报的公司相关信息
点击下载可以进行相关附件下载。
本例只是简单提供了一个简单的实现方法,标准的填报功能没有提供附件服务器上传的功能,建议可以在产品改进中添加该功能,扩展填报上传附件的保存方式。