有没有遇到页面是新建一个新对象,对象里面需要上传附件,但是只有当对象保存时才将附件一同上传到数据库的情况?
这种情况的处理可以参考狐狸的思路:
@jsp页面创建一个botton bn,该button的实现用ExtJS实现。
@ExtJS用 form.form.submit()实现把文件附件上传到服务器本地,同时将文件的路径fileName和其它的对象信息通过JSONObject从后台 Sevlet传到到前台。
前台ExtJS:先将后台传递过来的JSONObject转换为JSON,然后用js的DOM操作渲染到JSP页面的input中,实现局部刷新。
form.form.submit({
url : '/PolicyPackage?tg=uploadPolicyAtt&nbbm='+nbbm+"&fileName="+fileName,
method : 'POST',
waitMsg: '正在上传...',
success : function() {
function(form, result) {//表单提交成功后,调用的函数.参数分为两个,一个是提交的表单对象,另一个是JSP返回的参数值对象
Ext.Msg.alert('Message','上传成功!');
//alert(result.response.responseText); //返回的json值的字符串
var json = Ext.util.JSON.decode(result.response.responseText); //用JSON对象获取JSON数据的值
//将返回的值渲染到jsp的INPUT
document.getElementById("attNBBM").value=json.attNBBM;//政策附件内部编码
document.getElementById("attName").value =json.attName;//附件名称
document.getElementById("attName").innerHTML =json.attName;//附件名称
win.close();
},
failure : function() {
Ext.Msg.alert('Error','上传失败.');
}
});
======================================================================
若这里是Ext.Ajax.request(后台都是添加到JSONObject,由response.getWriter输出)
Ext.Ajax.request({
url: '/PolicyPackage',
params: { tg:'delPolicyAtta', nbbm: this.get("nbbm") },
method: 'POST',
success: function (response) {
store.load({params:{
start:0,limit:15
}});
Ext.MessageBox.alert('成功', '附件删除成功');
var json = Ext.util.JSON.decode(response.responseText);
var tempNBBM = document.getElementById("attNBBM").value;
var newNBBM = tempNBBM .replace(("'"+json.nbbm+"',"),"");
document.getElementById("attNBBM").value=newNBBM;
},
failure: function (response) {
Ext.MessageBox.alert('失败', '附件删除失败');
}
})
区别在红色标注部分
@ JSP页面使用隐藏的input表单,可以获取ExtJS返回的json数据
@ 最后提交表单的时候传递到后台进行其它信息的保存与处理
由于文件是暂存在服务器本地的,所以当提交表单的时候要处理:
1、将服务器本地临时文件上传到服务器,并且删除临时文件
2、当对象不保存即表单不保存时删除临时文件
===============================================================================
但是这种模式仅仅适合用户不需要查看上传附件的情况,如果客户需要查看附件,这不能这么处理。
考虑下列做法:
将文件直接上传到数据库,表单不保存的时候删除数据库的文件。
上面这些是将附件放到数据库中的,但是也有大部分是将附件连接放到数据库中,但是文件放在服务器本地。
这种情况的处理就简单多了。但是人家客户这么要求整个文件放在数据库中,狐狸也只能想到这么做了。