本文介绍两种:上传文件到server的方式
一种是提交Form表单;还有一种是ajaxfileupload异步上传。
一、JSP中:
1、提交Form表单
为了能完毕文件上传,我们应该将这两个表单域所在表单的enctype属性设置为multipart/form-data。
<form action="uploadFiles_fourInsuranceFirstUpload.action" method="post" enctype="multipart/form-data">
文件标题:<input type="text" name="title" /><br>
选择文件:<input type="file" name="upload" /><br>
<input value="上传" type="submit" />
</form>
2、ajaxfileupload异步上传
<script src="${pageContext.request.contextPath}/script/jquery.js" type="text/javascript"></script>
<script src="${pageContext.request.contextPath}/script/ajaxfileupload.js" type="text/javascript"></script><pre name="code" class="javascript"> <script type="text/javascript" language="javascript">
//上传附件
function uploadFile() { $.ajaxFileUpload( {
url : 'tenantCredit_uploadFile.action', //你处理上传文件的服务端
type : 'post',
secureuri : false,
fileElementId : 'fileUpload',
dataType : 'text',
success : function(data) {
if (data == "true") {
alert("上传文件成功!");
} else {
alert("上传失败! " );
}
}
})
}
</script>
<input type="file" id="fileUpload" name="upload" value="上传" />
<input type="button" id="btnUploadFile" onclick="javascript:uploadFile();" value="保存记录"/>
二、Action中该怎样获取文件呢?
upload属性分别相应前面的表单域的upload属性。用于封装表单域的请求參数。
Action中包括了两个属性:
uploadFileName:封装上传文件的文件名称
uploadContentType:封装上传文件的文件类型。
Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名称和文件类型,所以Struts2直接将文件域中包括的上传文件名称和文件类型的信息封装到uploadFileName和uploadContentType属性中。
能够觉得:假设表单中包括一个name属性为xxx的文件域,则相应Action须要使用三个属性来封装该文件域的信息:
类型为File的xxx属性封装了该文件域相应的文件内容。(文中的 File upload属性中的upload就是以下两个string的属性的前缀)
类型为String的xxxFileName属性封装了该文件域相应的文件的文件名称。
类型为String的xxxContentType属性封装了该文件域相应的文件的文件名称。
通过上面的三个属性,能够更简单地实现文件上传,所以能够直接通过调用getXxx()方法来获取上传文件的文件名称、文件类型和文件内容。
// 封装上传文件域的属性
private File upload;
// 封装上传文件类型的属性
private String uploadContentType;
// 封装上传文件名称的属性
private String uploadFileName;
// 标记上传文件的结果:成功/失败
private String result; public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
} // 上传附件
public String uploadFile() {
try {
String realpath = ServletActionContext.getServletContext().getRealPath("/data"); if (upload != null) {
File savefile = new File(new File(realpath), uploadFileName);
if (!savefile.getParentFile().exists())
savefile.getParentFile().mkdirs();
FileUtils.copyFile(upload, savefile);
ActionContext.getContext().put("message", "文件上传成功");
}
// 提示:上传成功
result = "true";
outPrint(response, result); } catch (Exception e) {
// 提示:上传失败
String result = "false";
outPrint(response, result);
}
return null;
}
三、比較上述两种方式的优缺点:
1.验证是否选中文件:
①提交Form方式:
缺点:假设未选中文件,用JS捕获后return false,也会提交Form!还须要在Action的方法中进行判定。
②Ajax方式:
若未选中文件,用JS进行判定return false,将不会提交Action
2.传递參数的方式
①提交Form方式-2种:
利用ModelDriven属性,在Action中直接获取相应控件的value
或JSP中标识一个id,后在Action中定义此id的get、set方法,就能够直接取到。
②Ajax方式-3种:
同①
或通过JS中url传參的方式
3.接收Action中的返回结果
①提交Form方式:
把返回结果放在值栈/Session中,后再JSP中取出。
②Ajax方式:
同①
或JS回调函数通过data获取Action的返回值。
或JS回调函数通过data获取Action中outPrint
综合上述比較。推荐使用Ajax方式上传文件