【Struts2】4.文件上传与下载

来源:互联网 发布:mac视频和音频不同步 编辑:程序博客网 时间:2024/06/10 18:05
进行文件上传时,必须将表单的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{@Overrideprotected 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;}@Overridepublic 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");}@Overridepublic 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;}@Overridepublic 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>



注:此文档为学习圣思园风中叶教程结合自身学习所记录。
原创粉丝点击