`
whp0731
  • 浏览: 174773 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Sturt2学习之十二---文件上传

阅读更多

一、纯jsp文件上传
1、新建文件夹upload
内含upload.jsp,result.jsp

1)upload.jsp需要指定method="post"和enctype="multipart/form-data"

<body>
 <form action="result.jsp" method="post" enctype="multipart/form-data"> 
 Information: <input type="text" name="info"><br>
 File: <input type="file" name="file"><br> 
 <input type="submit" name="submit" value=" submit "> 
 </form>
</body>

 

2)result.jsp(真正开发的时候不会这么去写的,这里为了了解这个过程)

<body>
<%
 InputStream is = request.getInputStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 String buffer = null; 
 while((buffer = br.readLine()) != null)
 {
  out.print(buffer + "<br>");  
 }
%>
</body>

 

当然以前jsp可以用的是smartupload组件

 

二、纯apache的Commons项目内的FileUpload上传文件

 

 

基本它已经做好了90%,我们修改一下就可以!
struts2它可以选择三种方式
1、默认的就是apache的Commons项目内的FileUpload,从官方网站上下载commons-fileupload-bin.zip
commons-io-bin.zip,解压缩。里面包含了jar,文档api,源代码等
本部分来阐述FileUpdate的使用
2、源代码
1)upload2.jsp

 

<body>
<form action="/struts2/UploadServlet" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
file1: <input type="file" name="file1"><br>
file2: <input type="file" name="file2"><br>
<input type="submit" value="submit">
</form>
</body>

 

2)UploadServlet.java

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.omg.CORBA.portable.InputStream;

public class UploadServlet extends HttpServlet
{

 @SuppressWarnings("unchecked")
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException
 {  //先 生成一个工厂
  DiskFileItemFactory factory = new DiskFileItemFactory();

  String path = request.getRealPath("/upload");
       //若你上传的文件比较小几十k,那么会将文件直接放在内存中
  //当上传文件比较大时,那么会先放到一个临时目录中,setRepository就是来设置这个目录 的。
  factory.setRepository(new File(path));
  //当上传文件超出下面的大小时,那么会先放到一个临时目录中,setSizeThreshold就是来设置这个目录 的。
  factory.setSizeThreshold(1024 * 1024);
//生成ServletFileUpload实例
  ServletFileUpload upload = new ServletFileUpload(factory);

  try
  {//list封装了客户端传过来所有属性
   List<FileItem> list = upload.parseRequest(request);

   for (FileItem item : list)
   {//item.isFormField()来判断是否简单  的类型,true表示简单的属性。
    if (item.isFormField())
    {
     String name = item.getFieldName();//获得字段名字

     String value = item.getString("gbk");//获得字段值

     System.out.println(name);

     request.setAttribute(name, value);
    }
    else
    {
     String name = item.getFieldName();

     String value = item.getName();
                           //获得文件名,先去掉路径。(因为有的浏览器返回的全部路径+文件名;有的是光返回文件名)
     int start = value.lastIndexOf("\\");

     String fileName = value.substring(start + 1);

     request.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)) > 0)
//     {
//      os.write(buffer, 0, length);
//     }
//
//     os.close();
//
//     is.close();
    }
   }

  }

 

 

3)web.xml增加以下内容
 

<servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.test.servlet.UploadServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/UploadServlet</url-pattern>
 </servlet-mapping>
注释掉<!-- <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.FilterDispatcher
  </filter-class>
 </filter>


 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
      -->

 
4)result2.jsp

<body>
username: ${requestScope.username }<br>
password: ${requestScope.password }<br>
file1: ${requestScope.file1 }<br>
file2: ${requestScope.file2 }
</body>

 

 

三、Struts2文件上传(更加简单方便)

 

1、WebRoot目录下upload.jsp文件

<s:form action="upload" theme="simple" enctype="multipart/form-data">

   <table align="center" width="50%" border="1">
    <tr>
     <td>
      username
     </td>
     <td>
      <s:textfield name="username"></s:textfield>
     </td>
    </tr>

    <tr>
     <td>
      password
     </td>
     <td>
      <s:password name="password"></s:password>
     </td>
    </tr>


    <tr>
     <td>
      file1
     </td>

     <td >
      <s:file name="file"></s:file>
     </td>
    </tr>
    <tr>
     <td>
      file2
     </td>

     <td >
      <s:file name="file"></s:file>
     </td>
    </tr>
    <tr>
     <td>
      file3
     </td>

     <td >
      <s:file name="file"></s:file>
     </td>
    </tr>
    
    <tr>
     <td>
      <s:submit value=" submit "></s:submit>
     </td>

     <td>
      <s:reset value=" reset "></s:reset>
     </td>
    </tr>
   </table>

  </s:form>



 

2、struts.xml文件加入以下内容
     

  <action name="upload" class="com.test.action.UploadAction">
   <result name="success">/uploadResult.jsp</result>
 </action>

  

 

3、uploadaction.java

package com.test.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport
{
 private String username;

 private String password;

 private List<File> file;//file文件体

 private List<String> fileFileName;//fileFileName文件名

 private List<String> fileContentType;//fileContentType文件类型,
 //这三个名字命名不能改,上传多个文件时系统会一一对应

 public String getUsername()
 {
  return username;
 }

 public void setUsername(String username)
 {
  this.username = username;
 }

 public String getPassword()
 {
  return password;
 }

 public void setPassword(String password)
 {
  this.password = password;
 }

 public List<File> getFile()
 {
  return file;
 }

 public void setFile(List<File> file)
 {
  this.file = file;
 }

 public List<String> getFileFileName()
 {
  return fileFileName;
 }

 public void setFileFileName(List<String> fileFileName)
 {
  this.fileFileName = fileFileName;
 }

 public List<String> getFileContentType()
 {
  return fileContentType;
 }

 public void setFileContentType(List<String> fileContentType)
 {
  this.fileContentType = fileContentType;
 }

 @Override
 public String execute() throws Exception
 {
  for (int i = 0; i < file.size(); ++i)
  {//这里一定要用字节流,不要用字符流
   InputStream is = new FileInputStream(file.get(i));
//获得当前应用的根路径,ServletActionContext对应Servlet的Action的上下文
   //也可以写绝对路径d:/doucument/
   String root = ServletActionContext.getRequest().getRealPath(
     "/upload");

   File destFile = new File(root, this.getFileFileName().get(i));
          //文件输出流,接受的参数表示目的文件
   OutputStream os = new FileOutputStream(destFile);

   byte[] buffer = new byte[400];

   int length = 0;

   while ((length = is.read(buffer)) > 0)
   {
    os.write(buffer, 0, length);
   }

   is.close();

   os.close();
  }

  return SUCCESS;

 }

}

 
4、uploadResult.jsp

<body>

username: <s:property value="username"/><br>

password: <s:property value="password"/><br>

file: <s:property value="fileFileName"/>

</body>

 
5、让系统字符集支持中文

在我们的struts.xml文件可以配置

 <constant name="struts.i18n.encoding" value="gbk"></constant>

其实以后很多的strust框架中的default.properties文件中的很多内容都可以在我们的struts.xml通过<constant></constant>来赋值更改。
 
 <constant name="struts.multipart.saveDir" value="c:\"></constant>

default.properties文件中部分字段说明
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
以上三行表示struts上传功能对应的三种方式,其中第三种对应对应apache的fileupload


struts.multipart.saveDir=
struts.multipart.maxSize=2097152
表示上传后文件的保存路径和最大允许上传的文件为2M

 

三、Struts2文件上传(由客户端指定文件个数)
1、改写客户端文件WebRoot目录下upload.jsp文件

<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>

<script type="text/javascript">

function addMore()
{
 var td = document.getElementById("more");
 
 var br = document.createElement("br");
 var input = document.createElement("input");
 var button = document.createElement("input");
 
 input.type = "file";
 input.name = "file";
 
 button.type = "button";
 button.value = "Remove";
 
 button.onclick = function()
 {
  td.removeChild(br);
  td.removeChild(input);
  td.removeChild(button);
 }
 
 td.appendChild(br);
 td.appendChild(input);
 td.appendChild(button);
 
}

</script>

</head>

<body>

 <table align="center" width="50%">
   <tr>
    <td>

     <s:fielderror cssStyle="color:red" />

    </td>
   </tr>
  </table>


  <s:form action="upload" theme="simple" enctype="multipart/form-data">

   <table align="center" width="50%" border="1">
    <tr>
     <td>
      username
     </td>
     <td>
      <s:textfield name="username"></s:textfield>
     </td>
    </tr>

    <tr>
     <td>
      password
     </td>
     <td>
      <s:password name="password"></s:password>
     </td>
    </tr>


    <tr>
     <td>
      file
     </td>

     <td id="more">
      <s:file name="file"></s:file><input type="button" value="Add More.." onclick="addMore()">
     </td>
    </tr>
    
    <tr>
     <td>
      <s:submit value=" submit "></s:submit>
     </td>

     <td>
      <s:reset value=" reset "></s:reset>
     </td>
    </tr>
   </table>

  </s:form>

</body>

 
2、服务器端不用修改

 

四、Struts2文件上传(限制类型)


(限制类型),Struts2文件上传内部已经实现好了。
只需要在struts.xml文件中增加一个拦截器就好了,同时设置好相应的参数

       <action name="upload" class="com.test.action.UploadAction">
   <result name="success">/uploadResult.jsp</result>
   <result name="input">/upload.jsp</result><!--指strut处理错误时,自动地跳到input页面,此处需要配置-->
   <interceptor-ref name="fileUpload">
    <param name="maximumSize">409600</param><!--指每一个文件的大小-->
    <param name="allowedTypes">application/vnd.ms-powerpoint</param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack"></interceptor-ref><!--只要你配置拦截器,默认的必须加上-->
  </action>

       

说明:这里拦截器一般配置在result标签下面,
至于<param name="allowedTypes">application/vnd.ms-powerpoint</param>
里面的类型可以参考tomcat目录下的文件web.xml,该文件中的一个个<mime-type>类型都显示了这些类型的表示。例如
  

<mime-mapping>
        <extension>ppt</extension>
        <mime-type>application/vnd.ms-powerpoint</mime-type>
    </mime-mapping>



 

 

在message.propertiers资源文件中增加上传文件错误的提示信息
struts.messages.error.content.type.not.allowed=上传文件类型不允许,请重试!
struts.messages.error.file.too.large=上传文件过大,请重试!
当然右侧中文需要改成ascii,那么这里左侧的key是如何想出来的呢
也是通过上面 default.properties文件字段所得到的。

 

分享到:
评论
1 楼 lj508 2009-08-17  
你好啊 请教你个问题
我用那个纯jsp上传时
怎么运行时根本没的数据读出来啊
怎么解决啊 谢谢你了 我qq:407964628

相关推荐

    java struts2入门学习实例--使用struts2快速实现多个文件上传.doc

    ### Java Struts2入门学习实例——使用Struts2快速实现多个文件上传 #### 知识点一:配置Struts2中的错误提示信息 在开发基于Java的Web应用程序时,经常需要处理用户上传文件的需求。而Struts2框架因其灵活性与...

    struts-2.1.8.1-all-01

    5. **插件架构**:Struts 2有一个强大的插件系统,可以方便地扩展框架功能,如国际化的支持、文件上传下载等。 6. **Tiles框架集成**:提供了一个布局管理工具,帮助开发者创建可重用的页面组件和复杂布局。 7. **...

    struts2文件上传下载源代码

    通过研究这些代码,开发者可以学习到实际应用中的Struts2文件上传下载流程。 总之,Struts2文件上传和下载是Web开发中必不可少的功能,涉及的技术点包括表单处理、文件流操作、服务器配置以及错误处理。通过理解和...

    struts2 学习重点笔记

    - **文件上传**:利用 Struts2 的 FileUploadInterceptor 实现文件上传功能。 - **文件下载**:可以通过 Action 的响应流来实现文件下载。 #### 五、Struts2 实践技巧与优化 **5.1 性能优化** - **减少 Action ...

    学习struts2的实例---文件上传

    NULL 博文链接:https://zhenjw.iteye.com/blog/312108

    Struts2完全学习手册-第19-21章 源码

    这可能包括动态方法调用、OGNL表达式语言的使用、文件上传与下载、国际化与本地化支持、异常处理等。此外,你还会学习如何利用Struts2的插件机制扩展框架功能,例如集成Spring框架进行依赖注入,或者使用Tiles来管理...

    Struts.2权威指南--基于WebWork核心的MVC开发.0004.pdf

    - Struts 2框架提供了许多高级特性,例如文件上传下载、国际化支持、AJAX集成等。 - 开发者可以通过学习这些特性来提高应用程序的功能性和用户体验。 ### 总结 “Struts 2权威指南——基于WebWork核心的MVC开发....

    struts2学习笔记1-HelloWorld项目

    通过深入学习和实践,你可以掌握Struts2的更多功能,如表单验证、文件上传下载、AJAX集成、Spring整合等,从而提高你的Java Web开发能力。同时,理解Struts2的工作原理对于后续学习其他MVC框架,如Spring MVC,也会...

    struts-2.3.8-all-part2

    7. **插件(Plugins)**:Struts2提供了丰富的插件,如Ajax支持、文件上传、国际化等,可以快速扩展框架功能。 8. ** strut2-dojo-plugin**:Struts2与Dojo JavaScript库的集成,提供丰富的客户端控件和动画效果。 ...

    struts2-2.2.3-all.zip

    样例通常包含了一些基础的功能实现,如表单验证、文件上传下载、拦截器使用等,可以帮助开发者快速上手并理解Struts2的基本用法。通过研究这些样例,开发者可以学习到如何配置Struts2、如何编写Action类、如何使用...

    JavaEE Struts文件上传

    学习Struts2文件上传不仅需要掌握上述概念和技术,还需要了解文件安全性、异常处理和服务器配置等相关知识。在实际应用中,确保文件上传的健壮性和安全性是至关重要的,比如防止文件覆盖、大小限制、非法文件类型...

    struts2文件上传

    为了学习和实践Struts2的文件上传,你可以解压这个文件,查看其中的Action类、`struts.xml`配置文件,以及可能的JSP页面,以理解整个流程。 总结来说,Struts2的文件上传涉及到拦截器配置、Action类的编写以及...

    struts1 文件上传源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    通过分析这个源码包,开发者可以学习如何配置Struts 1框架以支持文件上传,了解ActionForm的使用,以及如何处理上传后的文件。此外,还能理解Apache Commons FileUpload库的工作原理,这对任何想要深入理解Struts 1...

    Struts 2权威指南--基于WebWork核心的MVC开发

    通过以上章节的学习,我们可以看到Struts 2框架的强大之处,以及它相较于其他MVC框架的优势。无论是在功能的丰富性还是在易用性方面,Struts 2都展现出了卓越的能力。对于希望使用Java进行Web开发的开发者来说,掌握...

    struts2学习笔记.doc

    - **上传原理**:Struts2利用MultipartResolver实现文件上传功能。 - **配置与实现**: - 在`struts.xml`中配置上传相关的参数。 - 实现Action类中文件上传的具体逻辑。 **5.2 文件下载** - **下载原理**:Struts...

    Struts2文件上传进度条

    Struts2文件上传进度条是Web开发中一个实用的功能,它允许用户在文件上传过程中查看当前的上传进度,提供更好的用户体验。在这个项目中,我们利用Struts2框架的拦截器机制来实现这一功能。 首先,我们需要理解...

    struts2文件上传例子.rar

    通过学习这个例子,开发者可以了解到Struts2处理文件上传的基本流程,为自己的项目提供参考。在实际开发中,我们还需要考虑到安全性问题,如防止文件覆盖、非法文件上传等,确保系统的稳定性和安全性。

    struts2上传文件源代码

    Struts2是一个强大的Java web应用...通过这个示例,开发者可以学习到如何在Struts2项目中实现文件上传功能,并了解其背后的原理和最佳实践。同时,也可以了解到如何与其他开发者共享和学习代码,从而提升自己的技能。

    struts-2.3.8-all-part1

    5. **其他可能的目录**:尽管这里只列出了四个主要目录,但完整的Struts 2框架可能还包括其他的组件,如web.xml配置文件、国际化资源文件(i18n)、测试案例等。这些组件都是构建和维护一个健壮的Struts 2应用不可或...

    java文件上传,Struts2文件上传,demo下载

    Java文件上传是Web开发中常见的功能,特别是在处理用户提交的图片、文档等数据时。Struts2是一个基于MVC设计模式的Java Web框架...通过学习和实践,你可以更好地掌握如何在Struts2框架下实现安全、高效的文件上传功能。

Global site tag (gtag.js) - Google Analytics