文件的上传和下载是Web应用中常用的功能。一般情况下可以通过使用二进制编码的方式来获得请求参数的值,从而通过二进制流来获得上传文件内容。这种手动编程方式比较麻烦,需要手动地控制二进制流,相当复杂。不过可以使用其他开源组织提供的上传项目来简单地完成文件上传。下面通过Struts2框架来完成文件的上传。
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar(如果要用到FileUtils类)。这2个文件可以从http://commons.apache.org/下载
第二步:把form表单的enctype设置为:"mulipart/form-data",如下:
<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post">
<input type="file" name="myFile"/>
<input type="submit" value="上传"/>
</form>
第三步:在action中添加如下属性:
public class HelloWorldAction {
private File myFile; // 上传的文件,变量名要与表单中file类型的属性名相同
private String myFileFileName; // 上传的文件名,变量的名字为File的变量名myFile+FileName(这是固定写法)
private String myFileContentType; // 上传的文件类型,变量的名字为File的变量名myFile+ContentType(这是固定写法)
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String execute() throws Exception {
String realPath = ServletActionContext.getServletContext().getRealPath(
"/files");
System.out.println(realPath);
File destFile = new File(new File(realPath), myFileFileName);
if (myFile != null) {
/* 如果保存文件目录的上一级目录不存在 */
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
/* 赋值文件到目标文件 */
FileUtils.copyFile(myFile, destFile);
ActionContext ctx = ActionContext.getContext();
ctx.put("message", "上传成功");
ctx.put("file", this.getMyFile());
ctx.put("fileName", this.getMyFileFileName());
ctx.put("fileContentType", this.getMyFileContentType());
}
return "success";
}
}
action中的属性名称要和表单中的文件类型的属性名称一致
struts.xml的配置:
<struts> <constant name="struts.configuration.xml.reload" value="true" /> <package name="itcast" namespace="/test" extends="struts-default"> <action name="hello" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>
hello.jsp:
<body>
${requestScope.message }<br/>
${requestScope.file }<br/>
${requestScope.fileName }<br/>
${requestScope.fileContentType }<br/>
</body>
说明:如果是多文件上传,需要在action中把文件的类型定义为数组或者是集合类型
package com.struts.action;
import java.io.File;
public class FileUploadAction {
private File[] myFile;
private String[] myFileFileName;
public File[] getMyFile() {
return myFile;
}
public void setMyFile(File[] myFile) {
this.myFile = myFile;
}
public String[] getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String[] myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
响应的页面为:
<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post">
<input type="file" name="myFile"/>
<input type="file" name="myFile"/>
<input type="submit" value="上传"/>
</form>