`
dzq2008
  • 浏览: 92735 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

利用Struts2实现文件上传 分享

阅读更多

Struts2中实现文件上传非常的简单。利用Struts2所提供的组件可以很容易的完成。

在此我们通过一个简单的文件上传实例进行讲解。

首先在建立的Web Project工程中加入所需要的Struts2的.jar文件。在此特别需要以下两个类库文件,分别为:commons-io-1.1.jar和 commons-fileupload-1.1.1.jar。因此在此项目中需要的Struts2的类库文件为如下所示:

下面开始实际的开发工作

因为采用了Struts2框架,所以需要像以前项目一样,在web.xml中加入struts2的配置,配置代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <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>
 <filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts-cleanup</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 首先建立上传文件的文件选择页面,此页面在此非常的简单,存在一个文件标题的描述输入框和文件选择组件

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
 
  <body>
    <s:form action="fileUpLoad.action" method ="POST" enctype ="multipart/form-data">
        <s:file name ="upFile" label ="FileName:" />
        <s:textfield name ="title" label ="Title:" />       
        <s:submit align="left"/>
    </s:form >

  </body>
</html>

 注意粗体部分,因为上传文件时,数据传输采用流的方式,所以需要设置enctype属性,设置为粗体的值。

窗体请求fileUpLoad控制器,下面当然是编写控制器了。注意在此文件选择组件的名称为upFile,此即为要上传得组件路经名称。在控制器中的很多地方要用到它

控制器代码如下:

package com.frank.action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UpLoadAction extends ActionSupport {
 private static final int FILE_SIZE=16*1024;
 private File upFile;
 private String upFileContentType;
 private String upFileFileName;
 private String title;
 public File getUpFile() {
  return upFile;
 }
 public void setUpFile(File upFile) {
  this.upFile = upFile;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public void setUpFileContentType(String upFileContentType) {
  this.upFileContentType = upFileContentType;
 }
 public void setUpFileFileName(String upFileFileName) {
  this.upFileFileName = upFileFileName;
 }
 public void upLoadFile(File source,File target){
  InputStream in=null;
  OutputStream out=null;
  try{
   in=new BufferedInputStream(new FileInputStream(source),FILE_SIZE);
   out=new BufferedOutputStream(new FileOutputStream(target),FILE_SIZE);
   byte[] image=new byte[FILE_SIZE];
   while(in.read(image)>0){
    out.write(image);
   }
  }catch(IOException ex){
   ex.printStackTrace();
  }finally{
   try{
    in.close();
    out.close();
   }catch(IOException ex){
    
   }
  }
 }
 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  System.out.println("hello");
  String filePath=ServletActionContext.getServletContext().getRealPath("images")
  +"/"+this.upFileFileName;
  
  File targetFile=new File(filePath);
  upLoadFile(upFile,targetFile);
  return SUCCESS;
 }
 public String getUpFileFileName() {
  return upFileFileName;
 }
}
 

注意,针对于选择的上传文件,在控制器中存在三个set方法与此对应,分别为setUpFile、 setUpFileContentType和setUpFileFileName,也就是说对于每个上传得文件,增加了ContentType和 FileName的set和get方法。用来取得上传文件的文件类型名称和文件名称。而常规的UpFile的set和get方法获取和设置的是File类 型。也就是要上传得文件。

在此增加了一个方法upLoad用来实现真正的文件上传操作。采用文件流的方式将上传得文件数据写入到目的地文件中。其实就是常规的文件流操作。

应该注意到,我们将文件上传到当前网站的images目录下,所以建立一个images目录即可。在编码中通过ServletActionContext.getServletContext().getRealPath("images")得到images的实际路经。

下面需要配置struts.xml了。当然需要在src下建立struts.xml配置文件,配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
 <include file="struts-default.xml"/>
 <package name="fileUpLoad" extends="struts-default">
  <action name="fileUpLoad" class="com.frank.action.UpLoadAction">
   <interceptor-ref name="fileUpload">
    <param name="allowedTypes">
     image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png
    </param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack"/>
   <result>success.jsp</result>
   <result name="input">index.jsp</result>
  </action>
 </package>
</struts>

 注意在控制器的配置中加入了两个拦截器。fileUpLoad拦截器负责拦截所选择的文件类型,通过参数 allowedType来实现。在此我们能看明白,上传得文件类型必须为:image/bmp,image/png,image/gif,image /jpeg,image/jpg,image/x-png    图片类型

同时需要加入defaultStack拦截器,这样在选择的文件违反条简单俄时候转发到input所指向的页面

当成功时,转发到success.jsp,此页面的职责是显示刚才上传得图片

代码非常的简单,使用<img>标记显示图片

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'success.jsp' starting page</title>
   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->

  </head>
  <body>
   <s:property value="title"/>
   <br>
   <img src='images/<s:property value="upFileFileName"/>'>
  </body>
</html>

 现在可以开始测试了:

 submit后,上传成功,显示图片

如果当时选择文件的时候,选择的类型违反了条件,不是图片,那么显示如下:

  • 大小: 14.2 KB
  • 大小: 24.6 KB
  • 大小: 36.1 KB
  • 大小: 31 KB
分享到:
评论

相关推荐

    Struts2实现文件上传

    在这个“Struts2实现文件上传”的主题中,我们将深入探讨如何利用Struts2框架来实现在Web应用中的文件上传功能。 首先,我们注意到一个细节描述:“private String uploadContextType;应更正为private String ...

    eclipse下利用struts2实现文件的上传和下载

    以上是使用Struts2在Eclipse环境下实现文件上传和下载的基本步骤和关键知识点。具体实现可能需要根据项目需求进行调整,但这些指导原则能帮助你构建一个基本的文件管理功能。在实际项目中,务必注意代码的健壮性和...

    swfuplaod+struts2实现多文件上传

    下面将详细介绍如何利用SWFUpload与Struts2来实现多文件上传。 **一、SWFUpload组件介绍** SWFUpload 是一个JavaScript库,它利用Flash技术提供了一个高级的文件上传体验。它的主要特性包括: 1. **多文件选择**...

    struts与hibernate实现文件的上传与动态下载

    本篇文章将详细讲解如何利用Struts2.2和Hibernate3.6实现文件的上传与动态下载。 **一、文件上传** 1. **环境配置**:首先,你需要一个集成开发环境,例如MyEclipse8.6,并安装所需的Struts2.21、JUnit4.8.2以及...

    java struts2实现文件上传进度条显示

    在Java Struts2框架中实现文件上传进度条显示,主要涉及到的技术点包括Struts2的文件上传、Ajax异步通信以及前端进度条组件的使用。下面将详细讲解这些知识点。 首先,Struts2的文件上传功能是通过Struts2提供的`...

    struts1实现文件上传

    ### Struts1 实现文件上传的关键技术点 在Struts1框架中实现文件上传功能是一项常见但又具有一定技术挑战的任务。下面将详细解析文件上传的实现过程,包括关键类的使用、文件处理逻辑以及异常处理等方面。 #### ...

    struts2实现文件上传(单个+多个文件上传

    ### Struts2实现文件上传(单个+多个文件上传) #### 一、单个文件上传 在Struts2框架中实现文件上传是一项常见的需求。本文将详细介绍如何在Struts2中实现单个文件的上传。 ##### JSP 页面设计 首先,我们需要在...

    Struts1实现文件上传源码

    在这个“Struts1实现文件上传源码”实例中,我们将深入探讨如何利用Struts1框架来处理文件上传操作。 在Web应用中,文件上传功能是非常常见的,比如用户上传头像、提交文档等。Struts1提供了ActionForm类和一系列...

    利用struts2实现上传文件进度条

    这个教程展示了如何利用Struts2和JSON在Java Web应用中实现文件上传的进度条功能。通过在后台不断更新进度信息并以JSON格式返回,前端可以实时显示上传进度,提升用户体验。请确保所有必要的库已添加到项目中,并...

    struts2实现文件上传

    在Struts2中实现文件上传是一项常见的需求,这通常涉及到客户端浏览器与服务器之间的数据交互,以及服务器端对上传文件的处理。下面我们将深入探讨如何在Struts2框架下实现文件上传。 首先,我们需要在HTML表单中...

    struts2的实现文件上传的例子

    在这个“struts2的实现文件上传的例子”中,我们将深入探讨如何利用Struts2框架来实现文件上传功能,并将其与MySQL数据库集成。 首先,我们需要在Struts2项目中配置Action类,这个类将负责处理文件上传请求。在...

    Struts2实现文件上传案例

    本文将详细介绍如何利用Struts2框架实现文件上传功能。Struts2是Apache软件基金会的一个开源Web应用框架,它使用MVC设计模式并支持多种编程模式(如命令式、声明式、函数式等),非常适合构建大型、复杂的Web应用...

    利用STRUTS2实现上传

    利用struts2实现文件上传,这里面有批量上传,和单一文件上传,功能实现很简单,但是必须先下载STRUTS2的jar包,以及在前台传入数据时候注意我的form表单,用sturts2上传必须改变form表单

    struts2实现的文件上传下载,上传文件重命名(按时间戳)

    在本项目中,我们关注的是如何利用Struts2实现文件上传并重命名(按时间戳),以及如何进行文件下载。 一、Struts2文件上传 在Struts2中,文件上传主要依赖于`org.apache.struts2.dispatcher.multipart....

    Struts2实现Uploadify多文件上传

    Struts2是一个强大的MVC...通过以上步骤,我们可以利用Struts2和Uploadify实现多文件上传功能,为用户提供友好的上传体验,同时确保服务器端能正确处理和存储上传的文件。在实际项目中,应根据具体需求进行定制和优化。

    struts2+ajax文件进度条的实现

    在Struts2中实现文件上传功能,通常会涉及到处理大文件、用户体验优化等问题,如显示文件上传进度条。这个场景下,我们结合Ajax技术,可以创建一个实时反馈文件上传进度的动态界面,提升用户交互体验。 首先,我们...

    Struts2文件上传源码

    对于更复杂的需求,可以利用Struts2的拦截器和插件来扩展功能,或者考虑使用其他专门处理文件上传的库,如Spring MVC的`MultipartFile`。理解源码有助于你更好地掌握Struts2的工作原理,从而在遇到问题时能更高效地...

    ext struts2 swfupload 跨域文件上传

    总结起来,"ext struts2 swfupload 跨域文件上传"是关于如何使用EXTJS构建前端界面,结合Struts2处理服务器端逻辑,利用SwfUpload的跨域能力实现文件上传的一种解决方案。这个过程中涉及的技术包括JavaScript编程、...

    struts2+jquery+ajax文件异步上传

    在文件上传场景中,Struts2主要负责接收前端发送的文件数据,并将这些数据存储到服务器的指定位置。配置Struts2的Action类和相应的XML配置文件,可以定义文件上传的处理逻辑。 接着,jQuery是一个高效、简洁的...

    Struts2全注解方式实现文件上传与下载

    在本资源中,我们将探讨如何利用Struts2的注解方式来实现文件的上传和下载功能,这对于任何Web应用来说都是至关重要的特性。 首先,我们来看“注解”在Struts2中的作用。Struts2允许开发者使用注解来配置Action类,...

Global site tag (gtag.js) - Google Analytics