`

struts2上传下载文件及出现的问题

阅读更多

 

在过去的这一周里,断断续续的在做文件上传下载。把这几天遇到的坑,一一写下来,让大家能避免。

 

 

 

1、  开发环境

 

Struts2.3.20+spring3.2.7+mybatis3.3.0

 

2、  使用ajaxfileupload.js+JQuery+servlet

 

在上传的过程中,图片上传不上,下载文件也不完整,有可能报错。

 

注意在struts2要使用Servlet

 

Web.xml

 

  <servlet-mapping>

 

    <servlet-name>XXServlet</servlet-name>

 

    <url-pattern>/XXServlet.servlet</url-pattern>

 

</servlet-mapping>

 

 

 

      页面调用要写成

 

document.myform.action= "${pageContext.request.contextPath}/XXServlet.servlet";

 

document.myform.submit();

 

 

 

上传不成功的原因,有可能是struts2拦截不到文件,也有可能是组件不兼容,我在IE7下测试没有问题,但是在IE11下有问题。

 

百度了N次,好多方法都试过了,结论不行。既然不行,那么老老实实的用struts2自带的上传下载组件吧。

 

3、  上传主页面

 

<td bgcolor="#D3DFEF" width="100%" colspan="3">

 

       <iframe id="iframe" scrolling="no" width="100%" height="25" frameborder="0" src="${pageContext.request.contextPath}/Tksm/proplan/UploadFiles.jsp" ></iframe>

 

</td>

 

4、  UploadFiles.jsp页面部分代码

 

function testUpload(){

 

       var excelpath = document.forms[0].upload.value;

 

       var url = '${pageContext.request.contextPath}/modiProImages';

 

      

 

       if(excelpath!=null && excelpath!=''){

 

              var ss = excelpath.split('.');

 

              var fileType = ss[ss.length-1];

 

              if(fileType=='jpg'||fileType=='JPG'||fileType=='pdf' || fileType=='PDF'){

 

               document.all.test.action = url;

 

               document.all.test.submit();

 

              }else{

 

                     alert("只允许上传.jpg.pdf类型文件!");

 

                     document.all.test.reset();

 

                     return ;

 

              }

 

       }else{

 

              alert("请选择上传文件");

 

              return ;

 

       }

 

}

 

 

 

<form method="post" id="test" action="#" enctype="multipart/form-data">

 

       <table width="100%" cellspacing=0>

 

              <tr>

 

                     <td colspan="1" style="solid #8CB1D6;background-color: #D3DFEF;">

 

                            <input type="file" name="upload" style="width:360px; height: 24px;">

 

                            <button onclick="testUpload();" style="height: 24px;">上传</button>

 

                     </td>

 

              </tr>

 

  </table>

 

</form>

 

5、  struts.xml注册

 

<action name="modiProImages" class="proInfoAction" method="modiProImages">

 

  <result name="success">/Tksm/proplan/UploadFiles.jsp</result>

 

  <result name="error">/WEB-INF/index/error.jsp</result>

 

  <result name="input">/Tksm/proplan/UploadFiles.jsp</result>

 

</action>

 

6、  ProInfoAction.java

 

    private File upload;

 

    private String uploadFileName;

 

    private String uploadContentType;

 

    生成setter/getter方法

 

@SuppressWarnings("unchecked")

 

public String modiProImages() throws Exception {

 

    request = ServletActionContext.getRequest();

 

    session = request.getSession(true);

 

    Profiles profiles = new Profiles();

 

    File fileinit;

 

   

 

    String tmpPath = "D:\\modiimages";

 

  fileinit = new File(tmpPath);

 

  if (!fileinit.isDirectory()){

 

    fileinit.mkdir();

 

  }

 

  String savePath = "modiimages/";

 

    String message = "";

 

    try {

 

       File f = this.getUpload();

 

       //System.out.println("name=="+this.getUploadFileName());

 

       FileInputStream inputstr = new FileInputStream(f);

 

      

 

    String wjmc = this.getUploadFileName();

 

    int index = wjmc.lastIndexOf(".");

 

    wjmc = wjmc.substring(index + 1, wjmc.length());

 

   

 

    String filename = pronum+"_"+LineNbr+"."+wjmc;

 

    File uploadFile = new File(tmpPath + "/" + filename);

 

      

 

      

 

       FileOutputStream outputstr = new FileOutputStream(uploadFile);

 

       byte[] buf = new byte[1024];

 

      

 

       int length = 0;

 

       while ((length = inputstr.read(buf)) != -1) {

 

           outputstr.write(buf, 0, length);

 

       }

 

       outputstr.flush();

 

       outputstr.close();

 

       inputstr.close();

 

 

 

    message = "文件上传成功!";

 

    return "success";

 

    }catch(Exception e){

 

       e.printStackTrace();

 

       message = "文件上传失败";

 

       return "input";

 

    }

 

}

 

 

 

7、  配置tomcat虚拟目录

 

Tomcat x.x\conf\Catalina\localhost文件夹下新建工程同名.xml文件

 

如果打算是双级虚拟目录,或者多级虚拟目录,写成aa#bb#cc.xml

 

 

 

需要手动在D盘新建modiimages文件夹。

 

 

 

<?xml version='1.0' encoding='utf-8'?>

 

<Context docBase="D:/modiimages " path="">

 

</Context>

 

8、  下载文件

 

function downFile(filename){

 

    var href="${pageContext.request.contextPath}/downCustFile?fileName="+filename;

 

    document.forms[0].action=href;

 

    document.forms[0].submit();

 

}

 

<td align="center" class="tda">

 

<a href="javascript:downFile('<s:property value="filename"/>')">

 

<font color="#3300CC"><s:property value="filename"/></font>

 

</a>

 

</td>

 

9、  下载struts2-sunspoter-stream-1.0.jar

 

10、              Struts.xml中注册方法

 

 

 

 

 

       <result-types>

 

           <result-type name="streamx" class="com.sunspoter.lib.web.struts2.dispatcher.StreamResultX" />

 

       </result-types>

 

 

 

<action name="downCustFile" class="proInfoAction" method="downCustFile">

 

  <result name="success" type="stream">

 

 

 

点击下载文件时,点击取消会报错:

 

严重: Servlet.service() for servlet jsp threw exception

 

java.lang.IllegalStateException: getOutputStream() has already been called for this response

 

这是一个struts2bug

 

 

 

<action name="downCustFile" class="proInfoAction" method="downCustFile">

 

  <result name="success" type="streamx">           

 

     <param name="inputName">inputStream</param>

 

      <param name="contentDisposition">attachment; filename=${fileName}</param>

 

      <param name="bufferSize">4096</param>

 

      <param name="contentType">application/octet-stream;charset=ISO8859-1</param>

 

  </result>

 

  <result name="error">/WEB-INF/index/error.jsp</result>

 

</action>

 

11、              ProInfoAction

 

    private String fileName;

 

    private InputStream inputStream;

 

生成getter/setter方法

 

 

 

public InputStream getInputStream(){        

 

       request = ServletActionContext.getRequest();

 

       String filepath = "/modiimages/"+this.getFileName();

 

       //System.out.println("filepath="+"/"+filepath);

 

       try {

 

              String fullpath = request.getRequestURL().toString();

 

              int index = fullpath.lastIndexOf("/");

 

              fullpath = fullpath.substring(0, index + 1)+filepath;           

 

              URL url = new URL(fullpath);

 

              URLConnection conn = url.openConnection();

 

              inputStream = conn.getInputStream();

 

             

 

              //System.out.println("inputStream=="+inputStream);

 

              return inputStream;

 

       } catch (MalformedURLException e) {

 

              //e.printStackTrace();

 

       } catch (IOException e) {

 

              //e.printStackTrace();

 

       }

 

       return null;

 

       /*

 

使用struts2自带的上传

 

如果使用这段代码,会报如下错误

 

StreamResultX : Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.

 

打印

 

inputStream===null

 

说明没有找到文件,文件输入流为空

 

 

 

       request = ServletActionContext.getRequest();

 

       session = request.getSession(true);

 

       String fname = this.getFileName();

 

      

 

       String filepath = "/modiimages/"+fname;

 

       String fullpath = request.getRequestURL().toString();

 

       int index = fullpath.lastIndexOf("/");

 

       fullpath = fullpath.substring(0, index + 1)+filepath;    

 

      

 

inputStream = ServletActionContext.getServletContext().getResourceAsStream(fullpath);

 

System.out.println("inputStream==="+inputStream);

 

fileName = encodingFileName(fname);

 

       return inputStream;*/

 

}

 

      

 

public String downCustFile() throws Exception {

 

       return "success";

 

}

 

 这一篇文章,参考了

https://blog.csdn.net/xiangchengguan/article/details/39860065

http://zfc.iteye.com/blog/1050009

https://www.cnblogs.com/lcngu/p/5094159.html

 

分享到:
评论

相关推荐

    struts2文件上传下载源代码

    文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`&lt;input type="file"&gt;`元素,用户可以选择本地文件。Struts2的Action类会接收这个文件,并使用`Commons ...

    struts2实现文件上传下载

    本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...

    struts2上传下载项目

    - 首先,要在`struts.xml`配置文件中启用文件上传支持,通过`&lt;constant&gt;`标签设置`struts.multipart.parser`为`jakarta`,并指定上传文件大小的限制。 - 创建一个Action类,该类通常会有一个字段类型为`File`或`...

    struts2上传和下载文件详细源码

    在这个"struts2上传和下载文件详细源码"中,我们可以深入理解Struts2如何处理文件上传和下载操作。 1. 文件上传: 在Struts2中,文件上传主要依赖于Apache的Commons FileUpload库。首先,需要在struts.xml配置文件...

    struts2文件上传下载

    在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...

    struts2 上传下载文件

    使用struts2框架进行文件的上传并限制文件的大小与类型,使用struts2框架实现文件下载

    struts2实现多文件上传下载

    1.能够对多个文件进行上传(可以选择上传文件个数,也即上传文件个数不定) 2.能够对上传路径进行配置文件指定(upload.properties),使用了一些类似单例模式的静态代码块 3.Struts2进行下载处理,能对上传的所有...

    基于Struts2的文件上传下载功能的完整源代码。

    在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...

    struts2文件上传和下载

    Struts2允许设置最大上传文件大小,并通过`filter-mapping`配置限制可接受的MIME类型。 6. **错误处理与反馈**: 在处理文件上传和下载时,可能会出现各种异常,如文件不存在、磁盘空间不足等。因此,需要适当的错误...

    struts2 上传文件及打包下载zip

    在这个"struts2 上传文件及打包下载zip"的示例中,我们将探讨如何利用Struts2实现文件上传和下载功能。 首先,文件上传是Web应用程序中的常见需求。在Struts2中,我们可以使用`Struts2`提供的`CommonsFileUpload`...

    Struts2文件上传下载和表单重复提交问题

    比如,防止文件名注入以绕过安全控制,限制上传文件的大小和类型以防止DoS攻击,以及确保下载的文件路径安全,避免目录穿越漏洞。 6. **异常处理** 在处理文件操作时,可能会遇到各种异常,如文件不存在、磁盘空间...

    struts实现的文件上传下载功能

    避免路径遍历攻击,确保文件存储在安全目录下,防止恶意文件的执行,以及检查上传文件的大小和类型,防止过大文件导致服务崩溃或恶意文件注入。 在本例中,提供的"updown"可能是一个包含示例代码、配置文件或测试...

    struts2 文件上传

    struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload

    struts2框架下的文件上传

    在Struts2中,文件上传是一个常见的需求,可以帮助用户从客户端上传文件到服务器。本文将详细讲解Struts2框架下三种不同的文件上传方式:copy模式、字节流上传和字符流上传。 1. Copy模式文件上传: Copy模式是...

    struts2文件上传与下载

    在Struts2中,文件上传和下载是常见的功能需求,主要用于处理用户在Web表单中提交的文件,如图片、文档等。下面将详细介绍Struts2中文件上传和下载的实现方法。 ### 1. 文件上传 #### 1.1 配置Struts2 首先,我们...

    JavaEE Struts文件上传

    Struts框架通过解析这个格式化的请求,可以获取到上传文件的信息。 1. **配置Struts2 Action**:在Struts2中,我们需要创建一个Action类来处理文件上传请求。这个类通常需要实现`ServletRequestAware`接口,以便...

    Struts2文件上传与下载

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括处理用户表单提交、进行文件上传和下载。在Web应用中,文件上传和下载是常见的需求,例如用户上传头像、下载文档等。Struts2通过其Action类和...

    struts2上传下载实例

    在Struts2中,文件上传和下载是常见的功能需求,尤其对于处理用户提交的表单数据时,如上传图片、文档等。这个"struts2_上传下载"实例则涵盖了多种实现这些功能的方法。 首先,Struts2的文件上传依赖于Apache的...

    struts2_uploadify带进度条的多文件上传下载

    总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...

Global site tag (gtag.js) - Google Analytics