struts2之如何向服务器上传文件

转载请注明:http://blog.csdn.net/uniquewonderq

问题:在struts2框架下实现文件上传

方案:struts2提供了拦截器可以自动实现文件上传,并且该拦截器存在于defaultStack中,是每个action默认使用的。复用之前的案例。

步骤一:打开上传页面

在struts.xml中,配置打开上传页面的action,代码如下:

</pre><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
    <!--
    package:包,用于对action进行封装

     -->
     <package name="customer" namespace="/customer" extends="struts-default">

     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor>
	 <!-- 注册拦截器栈 -->
	 <interceptor-stack name="myStack">
	 <interceptor-ref name="first"></interceptor-ref>
	 <interceptor-ref name="second"></interceptor-ref>
	 </interceptor-stack>
     </interceptors>
     <!-- 设置当前包下所有Action默认引用的拦截器 -->
     <default-interceptor-ref name="myStack"></default-interceptor-ref>
     <!-- 打开修改页面 -->
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >

     <!-- 引用拦截器 -->
     <!-- <interceptor-ref name="first"></interceptor-ref> -->
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>
      <!-- 文件上传示例 -->
      <package name="demo" namespace="/demo" extends="struts-default">
      <!-- 打开上传文件页面 -->
      <action name="toUpload">
       <result name="success">
      /WEB-INF/jsp/upload.jsp</result>
      </action>
      </package>
     </struts>

在WEB-INF下创建jsp文件夹,并在此文件夹下创建文件上传页面upload.jsp,代码如下:

<%@page pageEncoding="utf-8"%>
<html>
<head>
<body>
<form action="" method="post">
<input type="file" name="some"/>
<input type="submit" value="提交">
</form>
</body>
</head>
</html>

重新部署并启动tomcat,访问此页面,效果如下图:

点击选择文件后,则就像平时在网站上上传了文件一样。但是此时点击提交并无什么作用。因为我们还没有处理这个请求。

下面进行这方面的处理。

步骤二:导包

上传文件需要依赖新的包commons-io-1.3.2.jar将其引入到项目中后,包结构如下图:

步骤三:Action中处理上传请求

由于Action需要接受拦截器传入的临时文件,并对临时文件进行复制,因此需要提供一个文件操作的工具类FileUtil,代码如下:

package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileUtil {
	public static boolean copy(File src,File dest){
		BufferedInputStream bufferedInputStream=null;
		BufferedOutputStream bufferedOutputStream=null;
		try {
	 bufferedInputStream=new BufferedInputStream(new FileInputStream(src));
	 bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(dest));
	 byte[] bts=new byte[1024];
	 int len=-1;
	 while((len=bufferedInputStream.read(bts))!=-1){
		 bufferedOutputStream.write(bts,0,len);
	 }
	 return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		finally{
			if(bufferedInputStream!=null){
				try {
					bufferedInputStream.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}

			}
			if(bufferedOutputStream!=null){
				try {
					bufferedOutputStream.close();
				} catch (Exception e3) {
					e3.printStackTrace();
				}

			}
		}
	}
}

、然后创建上传文件Action类uploadAction,并根据拦截器传入的临时文件,将其赋值到某路径下。代码如下:

package action;

import java.io.File;
import org.apache.struts2.ServletActionContext;

import util.FileUtil;

//文件上传
public class UploadAction {
	//接受拦截器传入的临时文件
	private File some;
	//接受拦截器注入的原始文件名
	private String someFileName;

	public String execute(){
		if(some==null)
			return "error";
    //将文件放于项目部署路径下的upload文件夹下
		String path="WEB-INF/upload/"+ someFileName;
	//根据相对部署路径计算完整路径
		path=ServletActionContext.getServletContext().getRealPath(path);
		//将临时文件复制到上述路径下
		FileUtil.copy(some, new File(path));
		return "success";
	}

	public File getSome() {
		return some;
	}

	public void setSome(File some) {
		this.some = some;
	}

	public String getSomeFileName() {
		return someFileName;
	}

	public void setSomeFileName(String someFileName) {
		this.someFileName = someFileName;
	}

}

上述代码中,用意是将文件复制部署的项目路径下的WEB-INF/upload文件夹下, 这样就可以不在项目中写死上传文件的路径了,而是随着部署位置的不同而自动变化,比较灵活,因此这里要求我们在项目中的WEB-INF下创建新的文件夹upload。

步骤四:

在struts.xml中,配置该action,并且设置文件上传的最大值,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
    <!--
    package:包,用于对action进行封装

     -->
     <package name="customer" namespace="/customer" extends="struts-default">

     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor>
	 <!-- 注册拦截器栈 -->
	 <interceptor-stack name="myStack">
	 <interceptor-ref name="first"></interceptor-ref>
	 <interceptor-ref name="second"></interceptor-ref>
	 </interceptor-stack>
     </interceptors>
     <!-- 设置当前包下所有Action默认引用的拦截器 -->
     <default-interceptor-ref name="myStack"></default-interceptor-ref>
     <!-- 打开修改页面 -->
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >

     <!-- 引用拦截器 -->
     <!-- <interceptor-ref name="first"></interceptor-ref> -->
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>

       <!-- 设置上传文件最大值 -->
      <constant name="struts.multipart.maxSize" value="5000000"></constant>

      <!-- 文件上传示例 -->
      <package name="demo" namespace="/demo" extends="struts-default">
      <!-- 打开上传文件页面 -->
      <action name="toUpload">
       <result name="success">
      /WEB-INF/jsp/upload.jsp</result>
      </action> 

      <!-- 上传文件 -->
      <action name="upload" class="action.UploadAction">
      <result name="success">/WEB-INF/jsp/ok.jsp</result>
      <result name="error">/WEB-INF/jsp/error.jsp</result>
      </action>
      </package>

     </struts>

步骤五:jsp

上述配置中,如果上传成功则转至ok.jsp页面,该页面代码如下:

</pre><pre name="code" class="html"><%@page pageEncoding="utf-8"%>
<html>
<head>
<body>
<h1 sytle="color:greed">文件上传成功!</h1>
</body>
</head>
</html>

如果上传失败则转到error.jsp,该页面代码如下:

<%@page pageEncoding="utf-8"%>
<html>
<head>
<body>
<h1 style="color:red">文件上传失败!</h1>
</body>
</head>
</html>

修改上传文件页面upload.jsp的表单属性值,代码如下:

<%@page pageEncoding="utf-8"%>
<html>
<head>
<body>
<!--
   	 上传文件对表单有两个要求
	1.method="post"
	2.enctype="multipart/form-data"
-->
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="some"/>
<input type="submit" value="提交">
</form>
</body>
</head>
</html>

步骤六:测试

重新部署项目并启动tomcat,打开上传文件页面,选择一个文件后点击提交按钮,文件被正确上传到项目部署路径下WEB-INF/upload文件夹下,效果如下图:

提交后,文件上传成功!

我们到 tomcat服务器去查看是否我们的文件提交到了服务器,

如果在下面的页面:

在上面页面直接点击提交,也就是所选文件为空,那么会出现如下

效果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 17:47:17

struts2之如何向服务器上传文件的相关文章

跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传. 问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦 直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于, 发送的时候使用"content-type" = "application/json"

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

Struts2 使用拦截器限制上传文件类型

<action name="upload" class="fileUploadAction" method="upload"> <interceptor-ref name="defaultStack"> <param name="fileUpload.allowedTypes">image/png</param> </interceptor-ref>

web服务器上传文件过程

通过web服务器上传文件,需要提前准备好下面3步,然后才能通过第4步上传文件1.web服务器的配置 1.1 将代码src目录中的select.c文件的170行的REQUEST_TIMEOUT改为10*REQUEST_TIMEOUT 1.2 在buildroot中选中boa后保存编译,然后更新nfs_root中内容: 1.3 重启单板 1.4 配置/etc/boa/boa.conf文件 1.4.1 屏蔽掉Group nobody,增加Group 0 1.4.2 去掉Errorlog前的屏蔽 1.4

模拟php curl向远程服务器上传文件

test.php: <?php header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = array('img'=>'@'. dirname(__FILE__).'/img/1.jpg'); curl_setopt($ch,CURLOPT_URL,"http://localhost:8088/curl/get_img.php"); cur

idea 内置tomcat jersey 跨服务器 上传文件报400错误

报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status of 400 Bad Request 因为跨服务器上传文件,文件名中里面含有中文名称,所以报错,解决: 让文件服务器支持utf-8编码或者将文件名变成英文.(最好的就是根据时间加随机数 或者是UUID来命名) 简单版的jsersey上传 @RequestMapping("/fileupload3&

ASP.NET跨服务器上传文件的相关解决方案

第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ Page Language="C#" EnableViewState="false"%> <%@ Import Namespace="System.Net" %><%@ Import Namespace="Syste

关于nutz跨服务器上传文件

发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器.项目中功能使用form表单上传 @At @AdaptBy(type = UploadAdaptor.class, args = { "${app.root}/WEB-INF/tmp" }) public String add(@Param("upload_file")TempFile f, HttpS

使用Putty实现windows向阿里云的Linux云服务器上传文件

1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动PSCP工具 首先需要保证在命令行下可以访问到pscp.exe.可以通过配置Windows的环境变量Path,或者直接通过命令行访问到pscp.exe. 首先进入到当前目录下: 例如:在windows系统下面: 之后开始传输文件到Linux服务器上 格式:pscp 文件 用户名@LinuxIP:目录