struts2为文件上传下载提供了更好的实现机制,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.1.jar;
1、<!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时进制文件可能会很大,还有就是enctype属性,这个属性一定要写multipart/form-data,不然就会以二进制文本上传到服务器端-->
<formaction="fileUpload.action"method="post"enctype="multipart/form-data">
username: <input type="text" name="username"><br>
file: <input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
2、配置struts
<action name=" fileUpload"
//cation指向路径
class="----------------------------- FileUploadAction"
//执行那个方法
method=" fileUpload">
//成功后返回的action
<result type="redirectAction">listAppMessage</result>
//出错后返回的页面
<result name="error" type="redirect">/login.jsp</result>
</action>
3、接下来是FileUploadAction部分代码,因为struts2对上传和下载都提供了很好的实现机制,所以在action这段我们只需要写很少的代码就行;
单个文件上传:
public class FileUploadAction extends ActionSupport
{
private String username;
//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件(文件名可以随便起,但是要用getFile, setFile作为方法名)
private File file;
//提交过来的file的名字(可以随便起,但是要用getFileFileName,setFileFileName作为方法名)
private String fileFileName;
//提交过来的file的MIME类型(浏览器传送过来的文件类型(excel,word等))
private String fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
System.out.println("fileFileName: " + fileFileName);
// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同
System.out.println("file: " + file.getName());
System.out.println("file: " + file.getPath());
byte[] buffer = new byte[500];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
return SUCCESS;
}
}
多文件上传基本和上面一样
Jsp页面定义的
<input type="file" name="file" >
<input type="file" name="file" >
-----------------
Java代码: 测试的时候把action指向的方法名改下(FileUploadAction2),或者再配置个
public class FileUploadAction2 extends ActionSupport
{
private String username;
//这里用List来存放上传过来的文件,file同样指的是临时文件夹中的临时文件,而不是真正上传过来的文件
private List<File> file;
//这个List存放的是文件的名字,和List<File>中的文件相对应
private List<String> fileFileName;
private List<String> fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public List<File> getFile()
{
return file;
}
public void setFile(List<File> file)
{
this.file = file;
}
public List<String> getFileFileName()
{
return fileFileName;
}
public void setFileFileName(List<String> fileFileName)
{
this.fileFileName = fileFileName;
}
public List<String> getFileContentType()
{
return fileContentType;
}
public void setFileContentType(List<String> fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
for(int i = 0; i < file.size(); i++)
{
InputStream is = new FileInputStream(file.get(i));
OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i)));
byte[] buffer = new byte[500];
@SuppressWarnings("unused")
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
}
return SUCCESS;
}
}
注意事项:jsp页面<input type="file" name="file" >的name要用”file” 要不到后台获得不到对应的临时文件(感觉能随便起会更好,不然后面存的时候不知道对应的前台那个控件);
author:LiuHongRan