博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2文件上传/下载(附源代码)
阅读量:5798 次
发布时间:2019-06-18

本文共 9534 字,大约阅读时间需要 31 分钟。

hot3.png

struts2对于文件的操作提供很多便捷的地方,因此在项目中多少会涉及到它的使用,当然网上关于它的帖子也确实不少,清楚地,不清楚的,详细的,不详细的,都有很多,我也曾学到过很多热爱分享的同行们的帮助,在这里,我便按我自己思路,整理了下,写成这篇博文,并提供效果图和附件的下载。

首先,按老规矩,上效果图:

图一

图二

图三

图四

图五

然后我们看下这个项目的结构图:

第一步,新建一个web项目,我这里偷了个懒,upload/download,干脆就叫updownload,并加入struts2的相关jar包

第二步,新建com.action.UploadAction.java代码如下:

package com.action;import java.io.File;import java.util.List;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport{    private static final long serialVersionUID = 1L;        private List
image; private List
imageContentType; private List
imageFileName; @Override public String execute() throws Exception { String path=ServletActionContext.getServletContext().getRealPath("/images"); System.out.println("保存路径为"+path);  
//文件拷贝         if (image.size()>0)        {            File savedir=new File(path);            if(!savedir.exists()) savedir.mkdirs();             for (int i = 0; i < image.size(); i++)            {                System.out.println("datas的个数"+image.size());                File saveFile=new File(savedir, imageFileName.get(i));                FileUtils.copyFile(image.get(i), saveFile);            }        }else {            System.out.println("datas为空");        }        
//文件拷贝的另一实现方式,还有一种是字节流去读取,比较原始,这里就省略了。//        for (int i = 0; i < image.size(); i++)//        {//            File data=image.get(i);//            String fileName=imageFileName.get(i);//            fileName=path+"\\"+fileName;//            data.renameTo(new File(fileName));//        }        return SUCCESS;    }    public List
getImage() { return image; } public void setImage(List
image) { this.image = image; } public List
getImageContentType() { return imageContentType; } public void setImageContentType(List
imageContentType) { this.imageContentType = imageContentType; } public List
getImageFileName() { return imageFileName; } public void setImageFileName(List
imageFileName) { this.imageFileName = imageFileName; } }

第三步,编辑index.jsp用于上传,新建success.jsp用于上传成功后的提示,代码如下:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'index.jsp' starting page	

success.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'success.jsp' starting page    	

上传成功

下载文件

第四步,新建struts.xml并配置web.xml,代码如下:(注:从struts.xml中可以看到,我这里对文件类型进行了规定,只能上传txt或者xml格式的文件)

struts.xml:

success.jsp
index.jsp
409600
text/plain , text/xml
web.xml:

s2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
s2
/*
index.jsp
BASIC

第五步,部署项目并运行起来,键入http://localhost:8080/updownload/index.jsp,检验文件上传是否成功,成功的话会跳转到success,jsp提示成功,并在服务器的updownload的目录下自动创建images目录,并将上传的文件保存。假使不成功请根据报错检查项目并进行改正。

第六步,加入文件上传能功能,我们便接着在此基础上,完成文件的下载功能。

首先是新建com.action.DownloadAction.java,代码如下:

package com.action;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.List;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.sun.org.apache.regexp.internal.REUtil;public class DownloadAction extends ActionSupport{    private static final long serialVersionUID = 1L;        private Dao dao=new Dao();    private List
list; private String fileId; private FileItem fileItem; //获得list public String list() { list=dao.getFileList(); return "list-success"; } //获得文件 public String get() { fileItem=dao.getFileItem(fileId); return "get-success"; } //获得输入流 public InputStream getInputStream() { try { String path=ServletActionContext.getServletContext().getRealPath("/"); String fileName=path+fileItem.getLocationPath(); FileInputStream fis=new FileInputStream(fileName); return fis; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //获得文件类型 public String getContentType() { return fileItem.getContentType(); } //获得文件下载位置 public String getContentDisposition() { try { return "attachment;filename="+URLEncoder.encode(fileItem.getFileName(),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //获得文件字节大小 public int getContentLength() { return fileItem.getContentLength(); } public List
getList() { return list; } public void setList(List
list) { this.list = list; } public String getFileId() { return fileId; } public void setFileId(String fileId) { this.fileId = fileId; } }

第七步,新建一个com.action.FileItem.java的javabean,用来模拟数据库中对应的实体类,这里我们就模拟下。代码如下:

package com.action;public class FileItem{    private String fileId;    private String fileName;    private String contentType;    private String locationPath;    private int contentLength;           //getter和setter略    }
第八步,写一个Dao,这个Dao原本该去查询数据库,并得到下载列表的,但是我们这里只是讲解struts2,所以便不连接数据库,如第七步一样,我们模拟出查询列表的方法,当然,查到的下载列表,就是我们在上传功能中,已经上传到服务器的文件列表。

所以我们新建的com.action.Dao的代码如下:

package com.action;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class Dao{        //静态数据,本该从数据库查出来的成为一个集合    private static  Map
files=new HashMap
(); static{ long id=System.currentTimeMillis(); String fileId="100"+id; files.put(fileId, new FileItem(fileId, "9-10.txt", "text/plain", "images\\9-10.txt", 206)); fileId="200"+id; files.put(fileId, new FileItem(fileId, "aaa.xml", "text/xml", "images\\aaa.xml", 156)); fileId="300"+id; files.put(fileId, new FileItem(fileId, "test.xml", "application/xml", "images\\test.xml", 617)); fileId="400"+id; files.put(fileId, new FileItem(fileId, "Tomcat支持的文件类型.txt", "text/plain", "images\\Tomcat支持的文件类型.txt", 21*1024)); } //获得文件下载列表 public List
getFileList() { return new ArrayList
(files.values()); } //根据id获得单个文件 public FileItem getFileItem(String fileName) { return files.get(fileName); }}
第九步:新建download.jsp和list-success.jsp,代码如下:

download.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'download.jsp' starting page    	
显示下载列表 br>
list-success.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'list-success.jsp' starting page    	

文件下载列表

${fileName}
 
第十步:修改struts.xml并在文件上传的下面,配置文件下载的action,并在src目录下,添加i18n.properties资源文件,对项目中的可能错误进行国际化,并在struts.xml中进行引用,即:
 
 

 
修改后的struts.xml如下:
 
 
success.jsp
index.jsp
409600
text/plain , text/xml
{1}-success.jsp
 
i18n.properties文件,代码如下:
struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u9519\u8BEFstruts.messages.error.file.too.large=\u6587\u4EF6\u8FC7\u5927struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u7C7B\u578B\u4E0D\u5141\u8BB8struts.messages.error.file.extension.not.allowed=\u6587\u4EF6\u6269\u5C55\u540D\u4E0D\u5141\u8BB8
 
 
 
 
 
 
 
 
 
【csdn】的附件上传真实太坑了,还得先上传为资源,再提供下载链接,我这边儿都上传了,可是还是看不见链接,没办法,只能给出我的iteye链接,,它是直接能下载的,也不要积分什么的,为此,还得鄙视一下csdn这种附件下载积分的做法,(#‵′)凸
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://my.oschina.net/bluesroot/blog/222621

你可能感兴趣的文章
HTTP之二 http 301 和 302的区别
查看>>
从源码看集合ArrayList
查看>>
Gephi
查看>>
git 入门宝典
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
移动web端自定义tap与模拟hover效果
查看>>
[译] Java 8 Nashorn 教程
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
CodeIgniter 3.0 新手捣鼓源码(一) base_url()
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
【九度OJ1516】|【剑指offer14】调整数组顺序使奇数位于偶数前面
查看>>
PHP去掉转义后字符串中的反斜杠\函数stripslashes
查看>>
一个快速的开发框架Wabacus
查看>>
Spring Test+JUnit完美组【使用Spring测试套件】
查看>>
Llinux 编译安卓 “android list targets 无target显示” 的解决方法
查看>>
Java NIO
查看>>
李炎恢老师XHTML视频教程(90课时)[已完结]
查看>>
我的友情链接
查看>>