进行文件上传时,必须将表单的method属性设为post,将enctype属性设为multipart/form-data。 Struts2在进行文件上传操作时,实际上是通过两个步骤实现的: 1) 首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录中,如果该键所对应的目录不存在,那么就保存到javax.servlet.context.tempdir环境变量所指定的目录中。 2) Action中所定义的File类型的成员变量file实际上指向的是临时目录中的临时文件,然后在服务器端通过IO的方式将临时文件写入到指定的服务器端目录中。
方式二:
Servlet实现
通过FileUploadInterceptor拦截器实现
public class UploadServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
//磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//文件保存路径
String path = req.getRealPath("/upload");
//设置属性,目录,用于临时存储的文件目录
factory.setRepository(new File(path));
//设置存储磁盘的最小值,超出该值直接存在磁盘,小于在内存中
factory.setSizeThreshold(1024 * 1024);
//新建一个文件上传
ServletFileUpload upload = new ServletFileUpload(factory);
try{
//获取到页面传递的列表
List<FileItem> list = (List<FileItem>)upload.parseRequest(req);
for(FileItem item : list){
String name = item.getFieldName();
//判断该项是文本单元还是文件域,若为文本单元
if(item.isFormField()){
String value = item.getString();
System.out.println(name + "=" + value);
req.setAttribute(name, value);
}
else//为文件
{//获取文件名称(不同浏览器不同,有些包含路径)
String value = item.getName();
int start = value.lastIndexOf("\\");
String fileName = value.substring(start + 1);
req.setAttribute(name, fileName);
//该行等价于下面的实现
item.write(new File(path, fileName));
//
// OutputStream os = new FileOutputStream(new File(path, fileName));
//
// InputStream is = item.getInputStream();
//
// byte[] buffer = new byte[400];
//
// int length = 0;
//
// while((length = is.read(buffer)) != -1)
// {
// os.write(buffer, 0, length);
// }
//
// is.close();
// os.close();
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
req.getRequestDispatcher("fileUploadResult.jsp").forward(req, resp);
}
}
struts2实现方式
public class UploadAction extends ActionSupport{
private String username;
private File file;
private String fileFileName;
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.getRequest().getRealPath("/upload");
InputStream is = n ew FileInputStream(file);
System.out.println("path: " + file.getAbsolutePath());
System.out.println("file: " + file.getName());
System.out.println("fileFileName: " + fileFileName);
File destFile = new File(root, fileFileName);
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[400];
int length = 0;
while(-1 != (length = is.read(buffer))){
os.write(buffer, 0, length);
Thread.sleep(1000);
}
is.close();
os.close();
return SUCCESS;
}
}
下载
方式一:
public class DownloadAction extends ActionSupport{
public InputStream getDownloadFile(){
return ServletActionContext.getServletContext().getResourceAsStream(
"/upload/comments.txt");
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
}
对应的struts.xml配置
<action name="downloadFile" class="com.shengsiyuan.struts2.DownloadAction">
<result type="stream">
<param name="contentDisposition">attachment;filename="文件名"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
方式二:
public class DownloadAction2 extends ActionSupport{
private int number;
private String filename;
public String getFilename(){
return filename;
}
public void setFilename(String filename){
this.filename = filename;
}
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number = number;
}
public InputStream getDownloadFile(){
try{
if (1 == number){
this.filename = "中文圣思园文件下载.txt";
//若为中文,会出现乱码的问题
this.filename = new String(this.filename.getBytes("gbk"),
"8859_1");
return ServletActionContext.getServletContext()
.getResourceAsStream("/upload/中文圣思园文件下载.txt");
}else{
this.filename = "CaptureSprite.exe";
return ServletActionContext.getServletContext()
.getResourceAsStream("/upload/CaptureSprite.exe");
}
}catch (Exception ex){
}
return null;
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
}
对应的配置
<action name="downloadFile2" class="com.shengsiyuan.struts2.DownloadAction2">
<result type="stream">
<param name="contentDisposition">attachment;filename=${filename}</param>
<param name="inputName">downloadFile</param>
</result>
</action>
注:此文档为学习圣思园风中叶教程结合自身学习所记录。