文档章节

Struts2文件上传与下载

milin
 milin
发布于 2014/12/15 23:37
字数 840
阅读 17
收藏 0

本文主要写的是struts2 的文件上传与下载(中文文件名问题的解决)。 

使用的时候直接在地址栏中输入:http://localhost:8080/fud/ 回车即可 

详细配置见下面代码: 
struts.xml文件的配置 

 

<?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>
	<!-- 设置默认编码格式 -->
	<constant name="struts.i18n.encoding" value="GBK" />
	<!-- 设置最大上传文件是300M -->
	<constant name="struts.multipart.maxSize" value="314572800" />
	<!-- 设置默认的临时文件存储位置 -->
	<constant name="struts.multipart.saveDir" value="C:/fileUpload" />
	<!-- 设置调试模式 -->
	<constant name="struts.devMode" value="true"></constant>
	<package name="fileupload" extends="struts-default" namespace="/file">
		<!-- 文件上传 -->
		<action name="upload" class="com.file.action.FileUploadAction">
			<result type="redirectAction">
				<param name="actionName">list</param>
				<param name="namespace">/file</param>
			</result>
		</action>
		<!-- 下载文件 -->
		<action name="download" class="com.file.action.FileDownloadAction">
			<result type="stream" name="success">
				<param name="contentType">application/octet-stream</param>
				<!-- 要有相对应的getDownloadFile()方法返回值是 InputStream -->
				<param name="inputName">downloadFile</param>
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<param name="bufferSize">4096</param>
			</result>
		</action>
		<!-- 文件下载列表 -->
		<action name="list" class="com.file.action.FileListAction">
			<result>/file.jsp</result>
		</action>
	</package>
</struts>

上传文件Action处理: 
上传的时候到不用注意中文编码问题,因为struts已经帮我们做了 

 

package com.file.action;

import java.io.File;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
	private File file;
	private String contentType;
	private String fileName;

	@Override
	public String execute() throws Exception {
		File saveFile = new File("c:/download/" + fileName);
		if (!saveFile.getParentFile().exists())
			saveFile.getParentFile().mkdirs();
		FileUtils.copyFile(file, saveFile);// 复制文件
		this.addFieldError("isSuccess", "文件上传成功!");
		return SUCCESS;
	}

	public void setUploadContentType(String contentType) {
		this.contentType = contentType;
	}

	public void setUpload(File file) {
		this.file = file;
	}

	public void setUploadFileName(String fileName) {
		this.fileName = fileName;
	}
}

 

下载时的Action,这个需要特别的注意:特别是在下载带有中文名字的文件的时候要对中文进行编码与解码。代码如下 

 

 

 

package com.file.action;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import com.opensymphony.xwork2.ActionSupport;

public class FileDownloadAction extends ActionSupport {
	private String fileName;// 要下载的文件名

	public String execute() throws Exception {
		return SUCCESS;
	}

	// 下载文件
	public InputStream getDownloadFile() {
		InputStream is = null;
		try {
			is = new FileInputStream("c:/download/" + fileName);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return is;
	}

	public void setFileName(String fileName) {
		try {// 解决中文文件名问题
			this.fileName = new String(fileName.getBytes("ISO-8859-1"), "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public String getFileName() {
		String name = "";
		try {// 解决下载文件中文文件名问题
			name = new String(fileName.getBytes("GBK"), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return name;
	}
}

 

下面这个与文件下载就没有什么关系了,主要是为了显示主页面用的:代码如下

 

package com.file.action;

import java.io.File;
import java.util.LinkedList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class FileListAction extends ActionSupport {
	private List<File> files = new LinkedList<File>();

	public String execute() throws Exception {
		return SUCCESS;
	}

	public List<File> getFiles() {
		File file = new File("c:/download/");
		File filelist[] = file.listFiles();
		for (File f : filelist) {
			files.add(f);
		}
		return files;
	}
}

 

接下来就是jsp页面了; 
导航页面index.jsp写法 

<mce:script language="javascript"><!--
	window.location = "/fud/file/list";
	 
// --></mce:script>

在这就是显示页面了 list.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	</head>
	<body>
		<h3>
			下载文件
		</h3>
		<table align="center" border="1">
			<tr>
				<td width="10%">
					序号
				</td>
				<td width="80%">
					文件名
				</td>
				<td width="10%">
					下载
				</td>
			</tr>
			<tr>
				<td>
					<s:iterator status="status" value="files" var="f">
						<tr>
							<td>
								<s:property value="#status.count" />
							</td>
							<td>
								<s:property value="#f.name" />
							</td>
							<td>
								<s:a action="download" namespace="/file" encode="false">
									<s:param name="fileName" value="%{#f.name}" />
								下载
								</s:a>
							</td>
						</tr>
					</s:iterator>
		</table>
		<hr>
		<!-- 文件上传模块 -->
		<s:form action="upload" method="post" enctype="multipart/form-data" namespace="/file">
			<s:file label="请选择文件" name="upload" ></s:file>
			<s:submit name="submit" value="提交"></s:submit>
			<s:fielderror name="isSuccess" />
		</s:form>
		<s:debug></s:debug>
	</body>
</html>

使用说明: 
在浏览器中输入:http://localhost:8080/fud 
结果如图(当然前提是"c://download/"文件夹下要有东西) 

本文转载自:http://blog.csdn.net/afgasdg/article/details/6451311

milin
粉丝 10
博文 94
码字总数 19598
作品 0
郑州
高级程序员
私信 提问
Struts2实现文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,...

颖辉小居
2015/11/26
78
4
Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解

文件上传和文件下载是我们在web应用程序中常用的两个功能,在java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,首先我...

长平狐
2012/11/12
547
1
struts2 上传 下载

东方部落: http://11144439.blog.51cto.com struts中上传文件功能小测试。这里jar是 2.5 版本。 项目结构图 废话不多说,直接代码。 2. web.xml配置...

东方部落
2017/05/24
0
0
struts2 用iframe 做个无刷新上传文件例子(一)

用Iframe来实现无刷新文件上传的注意点 1. 页面需要放一个iframe,并隐藏,然后让上传页面表单的target指定到这个iframe 2. struts2里面,中文文件编码处理,可以在配置文件,也可以在actio...

james_you
2014/04/26
1K
0
Struts2 文件上传 对XHR的请求 (ajax + formData 上传的文件) 拿不到文件

Struts2 对文件上传是通过 file upload 拦截器实现的,具体引入方法见这里。然而 File Upload 拦截器似乎对于 XHR 过来的文件上传请求无法响应。 MMP老子试了半天。 用ajax + formData 的方式...

小黄狗
2018/10/01
324
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Netty的FastThreadLocal速度快

前言 最近在看netty源码的时候发现了一个叫FastThreadLocal的类,jdk本身自带了ThreadLocal类,所以可以大致想到此类比jdk自带的类速度更快,主要快在什么地方,以及为什么速度更快,下面做一...

ksfzhaohui
2分钟前
0
0
资治通鉴解析:无论什么条件,要挟权力做出承诺,都会被清算

电影《满城尽带黄金甲》里有句经典的名言“朕赐给你的,才是你的。朕不给你的,你不能抢。”之所以这段话有名,核心的就是,它揭示了这样一个权力心思:无论什么情况,权力的行使,都不愿意受...

太空堡垒185
6分钟前
0
0
CSS技巧之向下箭头

本文转载于:专业的前端网站➫CSS技巧之向下箭头 思路: 使用◇符号(可在输入法的软键盘找到该符号),使用定位选择位置,并隐藏溢出的上半部分 细点: 1.使用i标签的楷体属性把◇变大 2.给i...

前端老手
23分钟前
0
0
SpringCloud alibaba微服务之NACOS多环境配置整合

前言 伴随着spring cloud alibaba 登上主板以后,我就去了解下感觉还是蛮不错的。说实话第一次看见Nacos好长一段时间连读法都不知道...(/nɑ:kəʊs/)。按照官方的话说Nacos是:一个更易于...

攻城狮-飞牛
25分钟前
2
0
tcpdump

tcpdump -A -s0 port 21011 -i any (1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2)-i eth1 : 只抓经过接口eth1的包 (3)-t : 不显...

mskk
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部