`

Struts2上传文件手动实现文件过滤

阅读更多

在实现了上传的功能的情况下,再加一点点代码就可以实现手动文件类型过滤


客户端jsp请求
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>简单的文件上传</title>
		<meta name="author" content="Yeeku.H.Lee" />
		<meta name="website" content="http://www.crazyit.org" />
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	</head>
	<body>
		<!--  <span style="color: red">${requestScope.typeError}</span> -->
		<s:debug></s:debug>
		<span style="color: red"> <s:property value="#typeError" /> </span>
		<form action="upload.action" method="post"
			enctype="multipart/form-data">
			文件标题:
			<input type="text" name="title" />
			<br />
			选择文件:
			<input type="file" name="upload" />
			<br />
			<input value="上传" type="submit" />
		</form>
	</body>
</html>

 


Action中部分代码
package lee;


/**
 * 手动实现文件过滤
 */

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

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UploadAction extends ActionSupport implements 
ServletContextAware {
	//封装文件标题请求参数的属性
	private String title;
	//封装上传文件域的属性
	private File upload;
	//封装上传文件类型的属性
	private String uploadContentType;
	//封装上传文件名的属性
	private String uploadFileName;
	//定义Action允许过滤的文件类型
	private String allowTypes;
	
	private ServletContext context;
	
	@Override
	public String execute() throws Exception
	{
		//将允许上传文件类型的字符串以英文(,)分解成字符串数组
		//从而判断当前文件类型是否可以上传
		String filterResult = filterType(getAllowTypes().split(","));
		//System.out.println(getAllowTypes());
		//System.out.println( filterResult);
		if(filterResult != null){
			//此put方法是将值放在Stack Content中而不是Value Stack Contents中
			ActionContext.getContext().put("typeError", "你要上传的文件类型不正确!!!");
			return filterResult;
		}
		
		//以服务器的文件保存地址和原文件名建立上传文件输出流
		FileOutputStream fos = 
			new FileOutputStream(context.getRealPath("/upload")
			+ "\\" + getUploadFileName());
		FileInputStream fis = new FileInputStream(getUpload());
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = fis.read(buffer)) > 0)
		{
			fos.write(buffer , 0 , len);
		}
		return SUCCESS;
	}
	
	//此方法用于过滤文件类型
	public String filterType(String[] types){
		//获取希望上传的文件类型
		String fileType = getUploadContentType();
		for (String type : types) {
			if(type.equals(fileType)){
				return null;
			}
		}
		return INPUT;
	}
	
	//文件标题的setter和getter方法
	public void setTitle(String title) 
	{
		this.title = title; 
	}
	public String getTitle()
	{
		return (this.title); 
	}
	//上传文件对应文件内容的setter和getter方法
	public void setUpload(File upload) 
	{
		this.upload = upload; 
	}
	public File getUpload() 
	{
		return (this.upload); 
	}
	//上传文件的文件类型的setter和getter方法
	public void setUploadContentType(String uploadContentType) 
	{
		this.uploadContentType = uploadContentType; 
	}
	public String getUploadContentType()
	{
		return (this.uploadContentType); 
	}
	//上传文件的文件名的setter和getter方法
	public void setUploadFileName(String uploadFileName) 
	{
		this.uploadFileName = uploadFileName; 
	}
	public String getUploadFileName() 
	{
		return (this.uploadFileName); 
	}
	public String getAllowTypes() {
		return allowTypes;
	}
	public void setAllowTypes(String allowTypes) {
		this.allowTypes = allowTypes;
	}
	
	public ServletContext getContext() {
		return context;
	}

	public void setContext(ServletContext context) {
		this.context = context;
	}

	public void setServletContext(ServletContext context) {
		this.context = context;
		
	}
	
}

 

Action只自己多一个方法要与过滤文件类型

//此方法用于过滤文件类型
	public String filterType(String[] types){
		//获取希望上传的文件类型
		String fileType = getUploadContentType();
		for (String type : types) {
			if(type.equals(fileType)){
				return null;
			}
		}
		return INPUT;
	}

 


strut. xml文件(多设置一个参数用于限定文件的类型Action中直接取)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd">	
<struts>
	<!-- 指定国际化资源文件的baseName为globalMessages -->
	<constant name="struts.custom.i18n.resources" value="globalMessages"/>
	<!-- 设置该应用使用的解码集 -->
	<constant name="struts.i18n.encoding" value="UTF-8"/>
	<package name="lee" extends="struts-default">
		<!-- 配置处理文件上传的Action -->
		<action name="upload" class="lee.UploadAction">
			<!-- 设置允许上传文件的文件类型 -->
			<param name="allowTypes">image/bmp,image/png,
			image/gif,image/jpeg</param>
			<!-- 上传失败退回input逻辑视图 -->
			<result name="input">/upload.jsp</result>
			<!-- 配置Struts 2默认的视图页面 -->
			<result>/succ.jsp</result>	
		</action>
	</package>
</struts>

 






 

分享到:
评论

相关推荐

    使用Struts2实现文件上传和下载的所有方案

    使用Struts2实现手动过滤文件上传的类型和大小 为了确保安全,通常需要限制上传文件的类型和大小。可以通过自定义拦截器或者在Action中实现检查。例如,可以检查文件扩展名,限制文件大小,甚至读取文件内容进行更...

    struts2 实现文件上传

    struts2 实现文件上传,手动对上传文件进行过滤,希望对大家有用 &lt;param name="allowTypes"&gt;application/octet-stream,application/pdf&lt;/param&gt; &lt;!-- 仅允许上传ppt,pdf格式的 --&gt;

    struts2文件上传、下载

    总结来说,无论是手动实现文件过滤还是利用Struts2提供的文件上传拦截器,都能够有效地控制文件上传的过程。而在文件下载方面,则主要依赖于HTTP响应头的设置以及文件流的处理。这些技术点是开发基于Struts2框架的...

    struts2 文件的上传与下载

    2. **使用拦截器实现文件过滤**:Struts2提供了一种更灵活的方法来实现文件过滤,即通过自定义拦截器。开发者可以创建一个自定义拦截器来处理文件上传前的验证逻辑。 3. **输出错误提示**:如果文件上传失败或不...

    struts2笔记之文件上传

    在Struts2中,有两种方式实现文件过滤和验证: 1. 手动验证:在Action类中重写`validate()`方法,检查`contentType`属性是否符合预设的允许类型列表。如果不符合,使用`addFieldError()`方法添加错误信息,导致视图...

    Struts2文件上传下载 中文乱码

    在Struts2框架中,文件上传和下载是常见的功能需求,但处理中文文件名或内容时,可能会遇到中文乱码的问题。这个问题主要涉及到字符编码的处理,包括HTTP请求的编码、文件名的编码以及文件内容的编码。接下来,我们...

    struts文件上传

    - 应限制文件大小和类型,对上传文件进行验证和过滤,例如只接受某些特定类型的图片或文档。 7. **前端响应**: - 一旦文件上传成功或失败,需要更新用户界面显示状态。可以通过JSP、JS或者其他前端技术来实现这...

    Struts2上传jQuery使用的框架和插件

    ### Struts2与jQuery结合实现文件上传的知识点详解 #### 一、技术栈介绍 本文主要探讨了在Struts2框架下使用jQuery及其插件实现文件上传的技术方案。具体涉及的技术栈包括: - **Struts2**: 一个开源的Web应用...

    上传一个手动搭建的struts2登录实例

    这个上传的压缩包文件包含了一个手动搭建的Struts2登录实例,可以帮助我们学习和理解Struts2的核心概念和配置。下面将详细阐述Struts2的基本原理、搭建流程以及关键组件。 首先,Struts2是Apache软件基金会开发的一...

    struts2详细介绍

    在MyEclipse中,为了获得struts.xml的代码提示,需要手动导入DTD文件,具体步骤如下: 1. 打开MyEclipse,依次点击**Window &gt; Preferences &gt; MyEclipse &gt; Files and Editors &gt; XML &gt; XML Catalog**。 2. 在右侧的...

    struts2自学文档

    - **拦截器**:Struts2的核心之一,通过拦截器可以实现诸如文件上传、输入验证等功能。 - **处理与分配流程**: - **前端请求**:用户发起的HTTP请求。 - **StrutsPrepareAndExecuteFilter**:处理请求的第一道...

    完美版(适合自学)struts2

    为了在MyEclipse中获得XML文件的代码提示,需要手动导入Struts2的DTD: 1. 打开MyEclipse的首选项设置。 2. 选择"Files and Editors" -&gt; "XML" -&gt; "XML Catalog"。 3. 添加新的DTD条目,指定struts-2.0.dtd文件的...

    struts2安全漏洞-升级struts2 jar文件从2.2.3至2.3.16

    - **CVE-2014-0114**:这个漏洞是由于Struts2的上传功能处理不当时,导致了文件包含漏洞,攻击者可以利用此漏洞将恶意代码写入服务器。 - **其他漏洞**:除了上述两个,Struts2还有许多其他的漏洞,如XSS(跨站...

    浪曦\浪曦_Struts2应用开发系列_第1讲

    5. **Struts2实现文件上传及下载**: - 使用`FileUpload interceptor`处理文件上传,理解多文件上传和限制大小的配置。 - 文件下载通过Action返回流对象实现,注意设置Content-Disposition和Content-Type头。 6. ...

    MVC架构,struts详细配置,多个struts配置文件,Action的调用方式

    然后,需要在`web.xml`中配置Struts2过滤器,以启动Struts2框架。默认的配置文件是`struts.xml`,通常放在`WEB-INF/classes`目录下。 **Struts2配置文件**: `struts.xml`是Struts2的主要配置文件,用于定义Action...

    Struts2 文档.doc

    Apache Struts 2 是一款强大的、可扩展的Java Web应用程序框架,它提供了高效的开发流程,涵盖了从构建、部署到后续应用程序维护...开发者可以通过Struts2轻松实现MVC模式,从而专注于业务逻辑的实现,而非底层的细节。

    struts2基本教程

    6. **commons-fileupload-1.2.1.jar** - 文件上传组件,处理用户上传文件。 特别注意的是,Struts2的2.1.6版本需要`commons-fileupload-1.2.1.jar`,因为它包含了`RequestContext`类,这是处理文件上传所必需的。...

    Struts2实现文件上传功能实例解析

    手动配置时,你需要下载Struts2的核心库,然后在项目的web.xml中添加Struts2的过滤器配置: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter....

Global site tag (gtag.js) - Google Analytics