一、文件的上传

1.单个文件上传

     Struts2使用拦截器完成了文件的上传,而且底层使用的也是FileUpload开源组件。

客户端注意事项:

(1)method="post"

(2)enctype="multipart/form-data"

(3)<intput type="file" name="photo">

 

在Action编写文件上传时,需要定义三个属性。

(1)文件类型File,属性名与表单中的file的name属性名一致。

(2)字符串类型,属性名: name属性名 + FileName eg: photoFileName 。

(3)字符串类型,属性名: name属性名 + ContentType eg: photoContentType 。

最后要为上述的三个属性名提供getXXX 和SetXXX方法。然后通过FileUtils的copyFile方法进行文件复制,将文件上传到服务器。

 

index.jsp

  1. <s:form action="uploadOne" method="post" enctype="multipart/form-data">
  2.  
  3. <s:textfield name="username" label="用户名"/>
  4. <s:file name="photo" label="照片"/>
  5. <s:submit value="上传"/>
  6.  
  7. </s:form>

UploadAction.java

  1. public class UploadAction extends ActionSupport{
  2.  
  3. private String username;
  4. private File photo;
  5. private String photoFileName;// 上传的文件名
  6. private String photoContentType;// 上传的文件的MIME类型
  7.  
  8. public String uploadOne() throws IOException{
  9.  
  10. System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "
  11. + photoContentType);
  12.  
  13. // 上传
  14. String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
  15.  
  16. FileUtils.copyFile(photo,new File(storeDir,photoFileName));
  17.  
  18. return SUCCESS;
  19. }
  20.  
  21. public String getPhotoFileName(){
  22. return photoFileName;
  23. }
  24.  
  25. public void setPhotoFileName(String photoFileName){
  26. this.photoFileName = photoFileName;
  27. }
  28.  
  29. public String getPhotoContentType(){
  30. return photoContentType;
  31. }
  32.  
  33. public void setPhotoContentType(String photoContentType){
  34. this.photoContentType = photoContentType;
  35. }
  36.  
  37. public String getUsername(){
  38. return username;
  39. }
  40.  
  41. public void setUsername(String username){
  42. this.username = username;
  43. }
  44.  
  45. public File getPhoto(){
  46. return photo;
  47. }
  48.  
  49. public void setPhoto(File photo){
  50. this.photo = photo;
  51. }
  52. }

结果:

     

 

2.文件上传存在的问题

     文件上传总大小默认是2M,如果超过了2M,程序会报异常,可使用<s:actionError>查看具体信息。

     (1)解决总大小的设置,找到常量

     struts.multipart.parser=jakarta    默认文件上传解析器,就是FileUpload组件

     struts.multipart.saveDir=        文件上传的临时文件存储目录

     struts.multipart.maxSize=2097152    文件上传的最大值(总大小),默认是2M

     在struts.xml设置常量,修改文件上传的默认总大小

  1. <!-- 配置上传文件的大小 -->
  2. <constant name="struts.multipart.maxSize" value="5000000"/>

 

    (2)还可以通过配置拦截器来设置文件上传

  1. <action name="uploadOne" class="com.kiwi.action.UploadAction" method="uploadOne">
  2.  
  3. <interceptor-ref name="fileUpload">
  4. <!-- 配置允许上传的文件类型,多个用","分隔 -->
  5. <param name="allowedTypes">
  6. image/bmp,image/png,image/gif,image/jpeg,image/jpg
  7. ,image/x-png,image/pjpeg
  8. </param>
  9. <!-- 配置允许上传的文件大小,单位字节 -->
  10. <param name="maximumSize">102400</param>
  11. </interceptor-ref>
  12. <interceptor-ref name="defaultStack" />
  13.  
  14. <result name="success">/success.jsp</result>
  15.  
  16. </action>

 

     (3)修改显示错误信息的资源文件信息

     第一步:创建新的资源文件例如message_zh_CN.properties,放置在src下在该资源文件中增加如下信息:

              struts.messages.error.uploading=上传错误: {0}

              struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}

              struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}

              struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

     第二步:在struts.xml文件加载该资源文件

  1. <constant name="struts.custom.i18n.resources" value="message"/>

 

3.多文件上传

     在JSP的页面上提供多组文件上传的输入框,选择多个文件上传。

index.jsp

  1. <s:form action="uploadOne" method="post" enctype="multipart/form-data">
  2.  
  3. <s:textfield name="username" label="用户名"/>
  4. <s:file name="photo" label="照片1"/>
  5. <s:file name="photo" label="照片2"/>
  6. <s:file name="photo" label="照片3"/>
  7. <s:submit value="上传"/>
  8.  
  9. </s:form>

UploadAction.java

  1. public class UploadAction2 extends ActionSupport{
  2.  
  3. private String username;
  4. private File[] photo;
  5. private String[] photoFileName;// 上传的文件名
  6. private String[] photoContentType;// 上传的文件的MIME类型
  7.  
  8. public String uploadOne() throws IOException{
  9.  
  10. // 上传
  11. String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
  12.  
  13. if(photo != null && photo.length > 0){
  14. for(int i = 0;i < photo.length;i++){
  15. FileUtils.copyFile(photo[i],new File(storeDir,photoFileName[i]));
  16. }
  17. }
  18. return SUCCESS;
  19. }
  20.  
  21. public String getUsername(){
  22. return username;
  23. }
  24.  
  25. public void setUsername(String username){
  26. this.username = username;
  27. }
  28.  
  29. public File[] getPhoto(){
  30. return photo;
  31. }
  32.  
  33. public void setPhoto(File[] photo){
  34. this.photo = photo;
  35. }
  36.  
  37. public String[] getPhotoFileName(){
  38. return photoFileName;
  39. }
  40.  
  41. public void setPhotoFileName(String[] photoFileName){
  42. this.photoFileName = photoFileName;
  43. }
  44.  
  45. public String[] getPhotoContentType(){
  46. return photoContentType;
  47. }
  48.  
  49. public void setPhotoContentType(String[] photoContentType){
  50. this.photoContentType = photoContentType;
  51. }
  52. }

 

二、文件的下载

index.jsp

  1. <s:a action="download?filename=1.jpg">1.jpg</s:a> <br>
  2. <s:a action="download?filename=2.jpg">2.jpg</s:a><br>
  3. <s:a action="download?filename=3.jpg">3.jpg</s:a><br>

struts.xml

 

  1. <!-- 文件下载 -->
  2. <action name="download" class="com.kiwi.action.DownloadAction">
  3. <result name="success" type="stream">
  4. <!-- 设置文件名称的MIME类型,值不是固定的,值是动态的 -->
  5. <param name="ContentType">${contentType}</param>
  6. <!-- 设置弹出下载的窗口,文件名称是动态的值 -->
  7. <param name="ContentDisposition">attachment;filename=${downloadFilename}</param>
  8. </result>
  9. </action>

DownloadAction.java

  1. public class DownloadAction extends ActionSupport{
  2.  
  3. //接受文件的名称
  4. private String filename;
  5.  
  6. /*
  7. * get请求的中文乱码问题需要自己解决
  8. */
  9. public void setFilename(String filename) throws UnsupportedEncodingException{
  10. this.filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
  11. }
  12.  
  13. /*
  14. * 提供一个方法,能获取的文件的MIME类型
  15. */
  16. public String getContentType(){
  17. return ServletActionContext.getServletContext().getMimeType(filename);
  18. }
  19.  
  20. /*
  21. * 返回的是文件的名称
  22. * 在弹出的下载窗口中,显示中文会有乱码的问题
  23. * 判断浏览器,根据不同的编码解决乱码的问题
  24. */
  25. public String getDownloadFilename() throws IOException{
  26. // 先获取user-agent头信息
  27. String agent = ServletActionContext.getRequest().getHeader("user-agent");
  28. // 调用该方法,编码
  29. String name = this.encodeDownloadFilename(filename, agent);
  30. return name;
  31. }
  32.  
  33. /*
  34. * 根据user-agent的头,和文件的名称,解决中文文件名编码的问题
  35. */
  36. public String encodeDownloadFilename(String filename, String agent) throws IOException{
  37. if(agent.contains("Firefox")){ // 火狐浏览器
  38. filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
  39. }else{ // IE及其他浏览器
  40. filename = URLEncoder.encode(filename,"utf-8");
  41. }
  42. return filename;
  43. }
  44.  
  45. /*
  46. * 提供一个方法名称必须是getInputStream()方法
  47. */
  48. public InputStream getInputStream(){
  49. // 获取要下载的文件的输入流,返回
  50. return ServletActionContext.getServletContext().getResourceAsStream("/download/"+filename);
  51. }
  52.  
  53. @Override
  54. public String execute() throws Exception{
  55. return SUCCESS;
  56. }
  57. }

结果:

     

Struts2基础学习(六)—文件的上传和下载的更多相关文章

  1. 【JavaWeb学习】文件的上传和下载

    一.文件上传 1.1.概述 实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet中读取上传文件的数据,并保存到本地硬盘中 如何在web页面中添加上传输入 ...

  2. SpringMVC 学习笔记(文件的上传和下载)

    在web项目中会遇到的问题:文件上传 文件上传在前端页面的设置:form表单 设置 input 类型 文件上传的请求方式要使用post,要将enctype设置为multipart/form-data ...

  3. Struts2 - 文件的上传和下载

    1.  前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2.  具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ...

  4. JavaWeb框架_Struts2_(七)----->文件的上传和下载

    这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量 ...

  5. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  6. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  7. jsp+servlet实现文件的上传和下载

    实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...

  8. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  9. Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

    Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...

随机推荐

  1. 原生javascript满屏上下滚动

    使用到一个滚动事件:onmousewheel  (不支持火狐浏览器)   /  DOMMouseScroll  (支持火狐浏览器):这篇代码支持ie8以上版本,Firefox,Safari,Chrom ...

  2. Java源码ExtJS 5 SpringMVC 4Hibernate 4通用后台管理开发框架

    需要源码,请加QQ:858-048-581 一.特色1.采用Spring MVC的静态加载缓存功能,在首页将Javascript文件.CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS ...

  3. ABP Zero源码

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 1.先编译成功,Nuget下载ABP的依 ...

  4. 探究CSS中的包裹性

    之前一直都知道css中的部分元素具有包裹性,今天写博客的时候正好也遇到了一个,所以想总结一下,有错误的地方欢迎指出来. 什么是包裹性? 包裹性就是父元素的宽度会收缩到和内部元素宽度一样. 哪些元素具有 ...

  5. C# .NET更智能的数据库操作封装项目

    前面两篇文章介绍了框架的思路及里面大概的实现过程,那时候忘记上传项目,就补发一下.顺便介绍下框架使用方式,并分析下框架使用的优缺点. 先发一下前两章的链接 篇一:http://www.cnblogs. ...

  6. MySQL中的完整性约束条件(主键、外键、唯一、非空)

    数据库的完整性约束用来防止对数据的意外破坏,来保证数据的安全性和一致性. 主键 1.创建表时候指定主键 创建表user(id, username, age),并且id字段非空自增. CREATE TA ...

  7. java基础:数组的拼接

  8. Tyvj P1813 [JSOI2008]海战训练

    P1813 [JSOI2008]海战训练 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 为了准备高层峰会,元首命令武装部队必须处于高度戒备.警察将监视每一条 ...

  9. Js里面的数组去重方法

    去掉数组里面重复的有很多种,我这里就说一种比较简单的吧. var arr=[23,33,44,33,44,66,44,55,44,4,44,33,23]; for(var i=0;i<arr.l ...

  10. 用 Visual Studio Code 调试 Node.js

    环境: Visual Studio Code  Node.js 1. 关闭运行中的程序 2.打开入口文件,我这里的入口文件为 app.js 3.点击左侧菜单栏的 debug 按钮 4.点击运行按钮 5 ...