xml中配置
<action name="download" class="com.test.DownloadTest">
<param name="inputPath">/备忘.txt</param>
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="备忘文件.txt"</param>
<param name="bufferSize">4096</param>
</result>
</action>
Action中代码
package com.test;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadTest extends ActionSupport {
private static final long serialVersionUID = -2459892982073583733L;
private String inputPath;
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getTargetFile() throws Exception {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
}
但是这样没有解决下载时候的保存文件名不是正确的文件名的问题。
而且每一个中文文件需要对应一个文件。很不方便。我自己设计了一个标签和一个servlet,专门处理这个问题,并且所有的文件不管在tomcat的web.xml中如何设置mime类型,都会弹出下载对话框,而不是应用相应的程序进行打开。
下面是标签库处理类
package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyJspTag extends SimpleTagSupport{
private String url;
private String display;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().println("<a href=\"downloadServlet?path=" + url + "\">" + display + "</a>");
}
}
下面是标签的tld文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>mytaglib</short-name>
<uri>my-tag</uri>
<tag>
<name>downloadLink</name>
<tag-class>com.tag.MyJspTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>url</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>display</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
下面是web.xml中对servlet的配置 , 需要将上述tld文件放置在web-inf文件夹下面
<servlet>
<servlet-name>downloadServlet</servlet-name>
<servlet-class>com.test.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downloadServlet</servlet-name>
<url-pattern>/downloadServlet</url-pattern>
</servlet-mapping>
下面是Servlet的处理
package com.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 8438995458642112537L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getParameter("path");
if(path != null && !path.trim().equals("")) {
path = new String(path.getBytes("iso-8859-1") , "utf-8");
String realPath = request.getSession().getServletContext().getRealPath(path);
File file = new File(realPath);
if(file.exists() && file.isFile()) {
InputStream in = null;
try{
in = new FileInputStream(realPath);
}catch (Exception e) {
PrintWriter pw = response.getWriter();
pw.println("您请求的资源 " + path + " 不存在");
pw.close();
return;
}
String fileName = "";
if(realPath.indexOf("\\") == -1) {
fileName = realPath;
} else {
fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
}
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes() , "iso-8859-1"));
OutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
} else {
PrintWriter pw = response.getWriter();
pw.println("您请求的资源 " + path + " 不是文件或文件不存在");
pw.close();
return;
}
} else {
PrintWriter pw = response.getWriter();
pw.println("错误的空资源");
pw.close();
}
}
}
下面是jsp中怎样应用标签
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="mytag" uri="/WEB-INF/mytag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<mytag:downloadLink url="中文1.rar" display="中文1"/>
<mytag:downloadLink url="中文2.txt" display="中文2"/>
</body>
</html>
显示的超链接是这样的。经测试在firefox和ie上基本能够正确处理下载问题。
<a
href
="downloadServlet?path=%E4%B8%AD%E6%96%871.rar"
>中文1</a
>
<a
href
="downloadServlet?path=%E4%B8%AD%E6%96%872.txt"
>中文2</a
>
分享到:
相关推荐
### Struts2下载地址及相关知识点 #### 一、Struts2简介 Struts2是一个开源的Web应用框架,它继承了Struts1的设计理念,并在此基础上进行了大量的改进和完善。Struts2是Apache软件基金会下的一个顶级项目,它采用...
在Struts2中实现下载功能是一项常见的需求,这通常涉及到处理文件流并将其发送到客户端。以下是如何在Struts2中实现下载功能的详细步骤: 1. **Struts2配置**: 在Struts2的配置文件(例如struts.xml或类似的配置...
本篇将深入探讨Struts2下载取消报异常的解决方法,以及相关的知识点。 1. **Struts2 文件下载原理** - Struts2提供了方便的Action类和结果类型,如`StreamResult`,来处理文件下载。通过设置HTTP响应头,如`...
标题 "Jxls结合Struts2下载" 暗示了一个教程或示例项目,它展示了如何在基于Struts2的Web应用中使用Jxls库来实现动态Excel文件的下载功能。Jxls是一个Java库,它扩展了Apache POI库,使得在Java中处理Excel模板变得...
有关struts2下载组件的具体介绍我就在此略过了,看此文的同志想必大多是碰到这样让人很是不爽的问题。 下面就将该问题的最终解决办法介绍如下。 问题概要: 在struts2中使用result里type="stream"的结果类型时,...
struts-2.0.6-lib.zip下载,struts下载,struts2下载,Apache Struts 2即是之前大家所熟知的WebWork 2。在经历了几年的各自发展后,WebWork和Struts社区决定合二为一,也即是Struts 2。
在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...
**Struts2漏洞详解** Struts2是一款广泛应用于企业级Java Web开发的开源框架,它为构建MVC(Model-View-Controller)架构的应用程序提供了强大的支持。然而,随着其广泛应用,安全问题也逐渐凸显,其中最为知名的便...
至此,一个基本的Struts2下载功能就实现了。用户点击下载链接,Struts2会通过`DownloadAction`处理请求,读取并返回指定文件,浏览器接收到响应后,会自动弹出文件保存对话框供用户选择保存位置。 请注意,这只是一...
在标题和描述中提到的"struts2 最新版"指的是Struts2框架的最新稳定版本,这里提供了一个无需到官方网站下载的途径。 Struts2的核心特性包括: 1. **Action和Result**: Struts2中的Action是业务逻辑的载体,它负责...
Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用程序。它在Java社区中广泛使用,因其灵活性、可扩展性和丰富的插件库而受到赞誉。Struts2的核心是Action类,它处理HTTP...
在"struts2资源下载"中,我们可以获取到与Struts2相关的各种资料,包括但不限于教程、示例代码、API文档、安全补丁以及社区提供的插件等,这些都对学习和使用Struts2框架极其有益。 Struts2的核心功能包括: 1. **...
本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...
3. 在struts2的Action通过2种不同的实现方法返回json格式的字符串。 4. 针对商品实现简单无刷新上传与下载 4. 批量导入数据采用的是导入test文件夹下的测试压缩包upload.rar上传到服务器的临时目录,然后利用WinRar....
Struts2是一款强大的Java web开发框架,由Apache软件基金会维护,是MVC(Model-View-Controller)设计模式的一种实现。这款框架的核心在于提供了一种结构化的应用开发方式,简化了开发过程,提高了代码的可复用性...
jxl+struts2下载execl创建多个sheet
struts下载上传 包括对中文处理 文件大小 扩展名 类型 处理等
在我们做struts2文件下载的时候,经常会遇到这种问题:点“打开/保存”一切正常,但当我们点击“取消”时,却报一堆的异常(其中包括ClientAbortException异常),非常让人头疼,如何彻底解决呢?附件中使用struts2-...
在Java Web开发中,Struts2被广泛用于构建企业级应用,提供了强大的控制层,使得开发者能够更有效地管理请求和响应流程。Struts2.2.3的"需要11个基本包"是指为了成功地配置和运行Struts2框架,开发者通常需要引入一...