Struts2对文件的上传功能进行了很好的封装,主要用的是fileUpload上传组件。
下面介绍Struts2的单文件上传:
首先你的jsp页面定义好一个上传文件的视图:
<s:form action="shop/file_register" method="post" enctype="multipart/form-data">
file:<s:file name="uploadFile"></s:file><br/>
<s:submit value="submit"></s:submit>
</s:form>
然后你对应的Action里面的处理方法应该如下:
先定义几个成员变量:
private String username;
private File uploadFile;
private String uploadFileFileName;
这里必须提醒的是:类型是String的变量uploadFileFileName,这个变量存储的是上传文件的文件名,这个变量的命名是有规则的,必须是以类型为File的变量名后面加上FileName,最后要生成这三个变量的get和set的方法。
方法里面应如下去操作:
String path = "H:/File";
try {
File target = new File(path, uploadFileFileName);
FileUtils.copyFile(uploadFile, target);
} catch (IOException e) {
e.printStackTrace();
}
先是定义一个File,构造它的路径,最后将上传的文件copy到target中,在设置的路径下就可以看到该上传的文件了。
Struts2多文件上传:
多文件的上传跟单文件是一致的,只需要将上面的变量更改为数组的形式,就可以达到多文件上传的目的了。
private String username;
private File[] uploadFile;
private String[] uploadFileFileName;
String path = "H:/File";
try {
for(int i = 0; i < uploadFile.length; i++) {
File target = new File(path, uploadFileFileName[i]);
FileUtils.copyFile(uploadFile[i], target);
}
} catch (IOException e) {
e.printStackTrace();
}
file1:<s:file name="uploadFile"></s:file><br/>
file2:<s:file name="uploadFile"></s:file><br/>
file3:<s:file name="uploadFile"></s:file><br/>
使用属性驱动的形式上传文件:
类型为File的变量都是直接声明在action中的,如果变量较多,则action中的get和set的方法就显得很臃肿了,所以就使用属性驱动的形式来将属性用javaBean进行封装。
先写一个封装类,将有关File的东西封装起来:
public class FileUploadTools {
private File uploadFile[];
private String uploadFileFileName[];
private String uploadFileContentType[];
public void upload() {
String path = "H:/File";
try {
for(int i = 0; i < uploadFile.length; i++) {
File target = new File(path, uploadFileFileName[i]);
FileUtils.copyFile(uploadFile[i], target);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public File[] getUploadFile() {
return uploadFile;
}
public void setUploadFile(File[] uploadFile) {
this.uploadFile = uploadFile;
}
public String[] getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String[] uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
}
public String[] getUploadFileContentType() {
return uploadFileContentType;
}
public void setUploadFileContentType(String[] uploadFileContentType) {
this.uploadFileContentType = uploadFileContentType;
}
}
下面写一个action:
public class File1Action extends ActionSupport{
private FileUploadTools fileUploadTools;
public String register() {
fileUploadTools.upload();
return "register";
}
public FileUploadTools getFileUploadTools() {
return fileUploadTools;
}
public void setFileUploadTools(FileUploadTools fileUploadTools) {
this.fileUploadTools = fileUploadTools;
}
}
jsp的内容如下:
<s:form action="shop/file1_register" method="post" enctype="multipart/form-data">
<s:file name="fileUploadTools.uploadFile"></s:file><br/>
<s:file name="fileUploadTools.uploadFile"></s:file><br/>
<s:file name="fileUploadTools.uploadFile"></s:file><br/>
<s:submit value="submit"></s:submit>
</s:form>
这样将有关文件上传的东西封装起来的话,很方便,也让我们的action变得简洁起来了。
Struts2的文件下载:
其实文件下载很简单,就是在给对方一个url地址就行了,但是现在问题是在下载含有中文的文件名的时候,就会出现bug,现在我们介绍一下用Struts2来控制这种不良情况的发生:
首先你要定义一个Action:
public class FileDownloadAction extends ActionSupport{
private String inputPath;
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public InputStream getFile() {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
}
这里的inputPath是定义一个下载文件的路径,它拥有一个set的方法是设置它的值,getFile方法返回的InputStream是下载文件的流。
下面要配置的是struts.xml:
<action name="download" class="com.xujianguo.action.FileDownloadAction">
<param name="inputPath">/picture/中文.jpg</param>
<result name="success" type="stream">
<param name="contentType">image/jpg</param>
<param name="inputName">file</param>
<param name="contentDisposition">filename="中文.jpg"</param>
<param name="bufferSize">4096</param>
</result>
</action>
第一个param是设置inputPath的值,contentType是指定下载文件的类型,inputName是指定被下载文件的入口的输入流,也就我们前面那个action中定义的方法,contentDisposition是指定下载的文件名,bufferSize是指定下载文件时候的缓冲大小。
最后就是你的jsp应该怎么写了:
<a href="shop/download">中文.jpg</a>
让href指向download这个action,然后我们前面做的功夫都会一步一步被调用。