最近搞了一下struts文件上传下载了,一个是通过struts自带的类实现的下载方法,一个是通用的下载方法:

struts实现:

FileDownloadAction.java
package com.fro.action;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; public class FileDownloadAction extends ActionSupport implements ServletRequestAware, ServletResponseAware { /**
*
*/
private static final long serialVersionUID = 1L; private HttpServletRequest request;
private HttpServletResponse response;
private int number;
private String fileName;
private String contentType; public int getNumber() {
return number;
} public void setNumber(int number) {
this.number = number;
} public String getFileName() {
return fileName;
} public void setFileName(String fileName) throws UnsupportedEncodingException {
this.fileName = fileName;
} public HttpServletResponse getResponse() {
return response;
} public void setResponse(HttpServletResponse response) {
this.response = response;
} public String getContentType() {
return contentType;
} public void setContentType(String contentType) {
this.contentType = contentType;
} // 返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流
public InputStream getDownloadFile() {
try {
if (1 == number) {
this.fileName = "使用说明书.doc";
// 解决文件乱码问题
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
}
this.contentType = "application/msword";
// 获取资源路径
return ServletActionContext.getServletContext().getResourceAsStream("files/使用说明书.doc");
} else if (2 == number) {
this.fileName = "ModbusV2.0_down.mp4";
// 解决文件乱码问题
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
}
this.contentType = "video/mp4";
// 获取资源路径
return ServletActionContext.getServletContext().getResourceAsStream("mediaelement/media/ModbusV2.0_down.mp4");
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
} @Override
public String execute() throws Exception { return SUCCESS;
} @Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
} @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}

struts.xml文件配置:

    <action name="FileDownload" class="com.fro.action.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">1024</param>
</result>
</action>

下面是通用的下载方法,不过我这里还是用struts实现的:

DdownloadAction.java
package com.fro.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; public class DdownloadAction extends ActionSupport implements ServletRequestAware, ServletResponseAware { /**
*
*/
private static final long serialVersionUID = 1L; private String contentType;// 文件类型
private String filename;// 指定下载后的文件名
private HttpServletRequest request;
private HttpServletResponse response; public InputStream getTargetFile() throws Exception { String realPath = request.getSession().getServletContext().getRealPath("/");
String filePath = realPath + "/mediaelement/media/ModbusV2.0_down.mp4";
System.out.println("filePath:" + filePath);
File file = new File(filePath); response.setContentType("application/octet-stream; charset=UTF-8");
String fileName = "ModbusV2.0_down.mp4";
// 解决中文文件名乱码问题
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
}
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] data = new byte[1024];
int len = 0;
while ((len = in.read(data)) != -1) {
out.write(data, 0, len);
}
out.flush();
return null;
} public String execute() throws Exception { return SUCCESS; } public String getContentType() {
return contentType;
} public void setContentType(String contentType) {
this.contentType = contentType;
} public String getFilename() {
return filename;
} public void setFilename(String filename) {
this.filename = filename;
} public HttpServletRequest getRequest() {
return request;
} public void setRequest(HttpServletRequest request) {
this.request = request;
} public HttpServletResponse getResponse() {
return response;
} public void setResponse(HttpServletResponse response) {
this.response = response;
} @Override
public void setServletResponse(HttpServletResponse response) {
response.setCharacterEncoding("utf-8");
this.response = response;
} @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}

struts.xml文件配置:

    <action name="download_*" class="com.fro.action.DdownloadAction" method="{1}">
<result name="success" type="redirect">/index.jsp</result>
</action>

下面是我的jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>My JSP 'filedownload.jsp' starting page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <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> <h2>文件下载内容:</h2>
<br /> 使用说明书.doc:
<a href="FileDownload.action?number=1">点击下载</a>
<br /> ModbusV2.0_down.mp4:
<a href="FileDownload.action?number=2">点击下载</a>
<br /> 使用说明书.doc:
<a href="download_getTargetFile.action">点击下载</a>
<br /> 使用说明书.doc:
<a href="file_download.action">点击下载</a> </body>
</html>

其中解决了下载文件文件名中文乱码问题。

其他方式:

 //判断是否为火狐浏览器
String Agent = request.getHeader("User-Agent");
StringTokenizer st = new StringTokenizer(Agent,";");
st.nextToken();
//得到用户的浏览器类型
String userbrowser = st.nextToken();
//LOGGER.debug(userbrowser+"浏览器---------------------------");
//LOGGER.debug(userbrowser.trim().toLowerCase()+"浏览器类型---------------------------");
//LOGGER.debug(userbrowser.trim().toLowerCase().contains("wow64)")+"是否为火狐浏览器----------------------------");
if(userbrowser.toLowerCase().contains("wow64")){
response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
}else{
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realName, "UTF-8"));
}

javaweb文件下载的更多相关文章

  1. 文件名含中文的JavaWeb文件下载

    在javaweb项目中实现文件下载,当文件名中包含中文文字时,需要进行如下的处理,才能在浏览器端正常显示中文文件名: response.setContentType("octets/stre ...

  2. JavaWeb文件下载,提示用户保存而不是让浏览器直接打开

    1.通过HttpServletResponse对象实现文件下载 服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt.jpg等,会直接在浏览器中显示,如果需 ...

  3. struts2框架学习之第三天

    day03 上传下载 1        上传下载组件介绍 l  jspSmartUpload(model1的年代): l  apache-commons-fileupload,Struts2默认上传组 ...

  4. struts2进阶

    Struts2 一.Struts的工作原理 Struts2的工作机制3.1Struts2体系结构图 Strut2的体系结构如图15所示: (图15) 3.2Struts2的工作机制 从图15可以看出, ...

  5. web批量下载文件到本地

    JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...

  6. java+web+批量下载文件

    JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...

  7. [javaweb]javaweb中HttpServletResponse实现文件下载,验证码和请求重定向功能

    HttpServletResponse web服务器接受到客户端的http请求之后,针对这个请求,分别创建一个代表请求的httpServletRequest和代表响应的HttpServletRespo ...

  8. javaWeb项目-文件下载的消息头和编码问题

    一.问题: 做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置? 二.解决: 1.例子 //设置响应的消息头response.setConte ...

  9. JavaWeb 之文件下载

    1. 下载概述 下载就是向客户端响应字节数据! 将一个文件变成字节数组, 使用 response.getOutputStream() 来响应给浏览器!! 2. 下载要求 两个头一个流 Content- ...

随机推荐

  1. 最长回文字符串(manacher算法)

    偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid. 题目描述:      回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. ...

  2. Zend Framework 留言本实战(转)

    一.环境搭建和ZF安装              *[注]本节内容大部分来至Zend Framework官方手册       1.1 Zend Framework下载 Zend Framework 使 ...

  3. Creating Apps With Material Design —— Defining Shadows and Clipping Views

    View转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android,时间仓促,有翻译问题请留言指出,谢谢 定义阴影和裁减 材料设计引入了深度的 ...

  4. license文件生成原理

      byte解密weblogic加密oraclehex 现在很多J2EE应用都采用一个license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的license文件对系统进行限制,比如试 ...

  5. C# WPF 建立渐隐窗口

    需求: 一些无关紧要的提示信息,不显示出来怕用户一头雾水,但如果用对话框显示出来,用户又要动手把对话框关闭.不说别人,就是程序员自己测试时都觉得麻烦! 解决方案: 有两种选择 1. 选择是用 labe ...

  6. Java基础知识强化42:StringBuffer类之StringBuffer的截取功能

    1. StringBuffer的截取功能: public String subString(int Start): public String subString(int Start, int end ...

  7. Python 正则表达试

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...

  8. Android(通用机能)

    数据存储 本地数据存在都是私有化的. 共享方法1是构造数据源组件.方法2将数据放入扩展存储设备. Mashup 服务组件默认没有运行在独立进程或线程中,因此费时操作一般需要起线程.可配置指定新进程. ...

  9. C#读取word模版并对指定域写入数据保存为新word

    引用: using System;using System.Collections.Generic;using System.Aspose.Words;using System.Windows.For ...

  10. Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)

    原文:InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序) InstallShield Limited Edi ...