java struts2文件上传,java jsp Struts2.X 文件上传

本文讲述了在Windows XP环境下,通过Java Struts框架处理前端JavaScript/ExtJS提交的文件上传,遇到请求流为空的问题,通过调整Ajax请求方式和JSON解析处理上传进度的解决过程。
摘要由CSDN通过智能技术生成

/**

*

*操作系统:WIN-XP

*后台程序:Java

*前端脚本:JavaScript/ExtJs/Html

*

*做过的尝试:用form的submit方式提交,在后台request.getInputStream()取到的值*为null,而*request.getContentLength()是可以正常取值的。用request.getRead()抛出错误,request has been *called 网查之后得知,似乎是Struts过滤掉了。另寻他法于是便有了下面代码。

*/

@ParentPackage(StrutsNamespace.PP_JSON)

@Namespace("")

@Action("savebillfile")

public class SaveBillFileAction extends SDBaseAction {

private static final long serialVersionUID = 5156288255337069381L;

private  String msg;

private int ErrNo;

private String contentType;

private File docmentFile;

private String fileName;

private Boolean success = false;

private String billtype;

private String billid;

public String upload() throws Exception {

Connection con =null;

Statement stm =null;

PreparedStatement pst=null;

ErrNo=0;

msg="";

if(!checkFile())

{

return SUCCESS;

}

if(docmentFile.isFile())

{

FileInputStream in = new FileInputStream(docmentFile);

try{

con=ConnectPools.getConnection(getSession());

Date dt=new Date();

String date = DateFormat.getDateInstance().format(dt);

String sSql = "insert into billfiles(billtype,billid,filename,fileext,uploaddate,filesize,opid,filedata)values(?,?,?,?,?,?,?,?)";

pst = con.prepareStatement(sSql);

pst.setString(1, billtype);

pst.setString(2, billid);

pst.setString(3, fileName);

pst.setString(4, fileName.substring(fileName.indexOf("."), fileName.length()));

pst.setString(5, date);

pst.setLong(6, in.available());

pst.setInt(7, ((EmployInfo)this.getSession().getAttribute("employ")).getId());

pst.setBinaryStream(8,in,in.available());

pst.executeUpdate();

}

catch(Exception e){

ErrNo=1;

msg=e.getMessage();

}

finally{

try{

pst.close();

stm.close();

con.close();

}catch(Exception e)

{

ErrNo=1;

msg=e.getMessage();

}

}

}

setSuccess(true);

return SUCCESS;

}

private boolean checkFile() {

// TODO Auto-generated method stub

//检查文件

return true;

}

public void setFileName(String fileName) {

this.fileName = fileName;

}

public void setUploadFileName(String fileName) {

this.fileName = fileName;

}

public void setUploadContentType(String contentType) {

this.contentType = contentType;

}

public void setUpload(File docmentFile) {

this.docmentFile = docmentFile;

}

public String getMsg() {

return msg;

}

public void setSuccess(Boolean success) {

this.success = success;

}

public Boolean getSuccess() {

return success;

}

public void setBilltype(String billtype) {

this.billtype = billtype;

}

public void setBillid(String billid) {

this.billid = billid;

}

public int getErrNo() {

return ErrNo;

}

public void setMsg(String msg) {

this.msg = msg;

}

public void setContentType(String contentType) {

this.contentType = contentType;

}

}

//到此java代码全了。。

//接下来是脚本submit之后发现上传的进度条一直在那里走来走去,我滴个肾,又是一番百度。由于我这不要跳转,百度上许多方法在我这似乎行不通。。只好改用了Ajax。。

/*

*  ajax那部分脚本如下

*/

var params={};

Ext.apply(params,{billtype:this.billType});

Ext.apply(params,{billid:this.billId});

Ext.Ajax.request({

url : 'savebillfile!upload.action',

timeout : 10000,

scope : this,

params:params,

isUpload:true,

form:"ufile",/*发现这个form好像有点不一样。。。ExtJs直接写出来的form好像有问题?*/

success : function(response)

{

var str =                                 response.responseText.substring(response.responseText.indexOf('{'),response.responseText.indexOf('}')+1);//前台脚本返回来的竟然被

框起来了。好吧,为了正常使用,就手动把json找出来。

var objFormData = Ext.util.JSON.decode(str);

if(objFormData.ErrNo==0)

{

Ext.Msg.show({

title:'提示',

buttons:Ext.MessageBox.OK,

msg: '上传成功!',

fn:function(button,e)

{

//上传成功关闭上传附件窗口

var window = Ext.getCmp('selectfileid');

window.close();

//刷新列表

var win= Ext.getCmp('billfileid');

var grid = win.findById('billfile_grid');

var store = grid.store;

store.load({

params:params

});

}

});

}

}

});

/*

* 最后贴出form的代码

*/

var fPanel=new Ext.Panel({

layout : 'form',

height:40,

html:'

请选择附件'

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值