今天在处理jar下载被IE自动将后缀修改为zip的时候,写了这么一个servlet;后面才发现原来是jboss中的mime.types中少了jar的配置,走了一大段弯路;这个Servlet在mime.types中即使没有配置的类型,大部份的浏览器都可以支持正常下载的,我的测试过程中使用七个浏览器,只有Opera在下载jar的时候会将其后缀恐怖的修改为exe。要使用这个Servlet,需要做的辅助工作就是要在web.xml中配置它,包括Servlet及servlet-mapping的配置,可参考以下内容:
<servlet>
<servlet-name>downloadServer</servlet-name>
<servlet-class>***.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downloadServer</servlet-name>
<url-pattern>/download_center.do</url-pattern>
</servlet-mapping>
,下载文件的时候,将链接使用如下形式:
http://****.com/download_center.do?file=myfile.jar
,就可以调用该DownloadServlet进行文件的下载了,详细的可以参考一下网络上其它的资料,以下是DownloadServlet.java的完整源码:
/**
* 类DownloadServlet.java的实现描述:TODO 类实现描述 文件下载Servlet
*
* @author root 2010-7-28 上午11:25:58
*/
/**
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 8228591081694973459L;
protected final static Log logger = LogFactory.getLog(DownloadServlet.class);
/*
* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File path = new File("");
String file = request.getParameter("file");// 通过该参数传入文件名
if (!fileSafeCheck(file)) {
StringBuilder sb = new StringBuilder("filename:").append(file).append(" is invalid");
if (logger.isDebugEnabled()) {
logger.debug(sb.toString());
}
response.setCharacterEncoding("gbk");
response.setContentLength(sb.length());
response.getWriter().write(sb.toString());
}
// 以下是文件名的完整路径,具体根据情况需要自己在这里处理一下了
String filePath = path.getAbsoluteFile().getParent() + file;
if (logger.isDebugEnabled()) {
StringBuilder sb = new StringBuilder("filename:").append(file).append(",file absolute path:").append(
filePath);
logger.debug(sb.toString());
}
if (filePath != null && filePath.length() > 0) {
try {
downloadFile(response, filePath);
} catch (Exception e) {
StringBuilder sb = new StringBuilder("download file exception,filename:").append(file).append(
",file absolute path:").append(
filePath);
logger.error(sb.toString(), e);
sb.delete(0, sb.length());
// sb.append("<script language=\"javascript\">alert('文件下载异常,请确定文件名是否正确.');</script>");
sb.append("<script language=\"javascript\">alert('download file err.');</script>");
response.setCharacterEncoding("gbk");
response.setContentLength(sb.length());
response.getWriter().write(sb.toString());
}
}
}
/*
* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
doGet(request, response);
}
/*
* (non-Javadoc)
* @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
*/
public void init(ServletConfig conf) throws ServletException {
// TODO Auto-generated method stub
super.init(conf);
}
/**
* 下载文件
*
* @param response
* @param filePath
* @throws RuntimeException
* @throws IOException
*/
private void downloadFile(HttpServletResponse response, String filePath) throws RuntimeException, IOException {
File file = new File(filePath);
if (!file.exists() || !file.canRead()) {
throw new RuntimeException("File not exists or can not be read!");
}
FileInputStream fileinputstream = new FileInputStream(file);
String filename = getFileName(filePath);
downloadFile(fileinputstream, null, filename, 2048, response);
fileinputstream.close();
fileinputstream = null;
file = null;
}
/**
* 下载文件
*
* @param filedata 下载数据流
* @param contentType 文件类型
* @param filename (下载后的)文件名称
* @param buffersize 缓冲区大小
* @param m_response
* @throws IOException
* @throws BimisException
*/
private void downloadFile(InputStream filedata, String contentType, String filename, int buffersize,
HttpServletResponse m_response) throws IOException, RuntimeException {
if (filedata == null) {
return;
}
if (buffersize <= 0) {
buffersize = 2048;
}
long contentLengh = filedata.available();
if (contentType == null || contentType.length() == 0) {
m_response.setContentType("application/x-msdownload");
}
else {
m_response.setContentType(contentType);
}
if (contentLengh > 0) {
m_response.setContentLength((int) contentLengh);
}
String m_contentDisposition = "attachment;";
if (filename == null || filename.length() == 0) {
m_response.setHeader("Content-Disposition",m_contentDisposition);
}
else {
m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(filename));
}
ServletOutputStream rspout = m_response.getOutputStream();
copyStream(filedata, rspout, buffersize, true);
}
/**
* 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
*
* @param s 原文件名
* @return 重新编码后的文件名
*/
private String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
private final long copyStream(InputStream source, OutputStream dest, int bufferSize, boolean flush)
throws RuntimeException {
int bytes;
long total;
byte[] buffer;
buffer = new byte[bufferSize];
total = 0;
try {
while ((bytes = source.read(buffer)) != -1) {
// Technically, some read(byte[]) methods may return 0 and we
// cannot
// accept that as an indication of EOF.
if (bytes == 0) {
bytes = source.read();
if (bytes < 0) break;
dest.write(bytes);
if (flush) dest.flush();
++total;
continue;
}
dest.write(buffer, 0, bytes);
if (flush) dest.flush();
total += bytes;
}
} catch (IOException e) {
throw new RuntimeException("IOException caught while copying.", e);
}
return total;
}
/**
* 根据传入的路径,获取文件的名称
*
* @param fullFilePath
* @return
*/
private String getFileName(String fullFilePath) {
if (fullFilePath == null) {
return "";
}
int index1 = fullFilePath.lastIndexOf('/');
int index2 = fullFilePath.lastIndexOf('\\');
// index is the maximum value of index1 and index2
int index = (index1 > index2) ? index1 : index2;
if (index == -1) {
// not found the path separator
return fullFilePath;
}
String fileName = fullFilePath.substring(index + 1);
return fileName;
}
/**
* 文件名的安全检查,以免被人通过"../../../"的方式获取其它文件
*
* @param filename
* @return
*/
private boolean fileSafeCheck(String filename) {
if (filename.indexOf("../") >= 0) {
return false;
}
return true;
}
}
分享到:
相关推荐
下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
在这个"Servlet文件下载项目"中,我们利用Servlet技术来实现文件的下载功能。这是一个非常实用的功能,尤其对于那些需要向用户提供文件下载服务的网站或应用。 首先,我们需要了解Servlet的基本工作原理。Servlet是...
本示例中,我们将探讨如何使用Java Servlet来实现文件的下载功能。 首先,理解HTTP协议是至关重要的,因为它定义了客户端(浏览器)与服务器之间的通信方式。在文件下载场景中,服务器需要响应一个HTTP请求,该请求...
在IT行业中,文件上传下载是Web应用中常见的功能,尤其在服务器端编程中,Servlet扮演着重要的角色。Servlet是Java编程语言中用于扩展服务器功能的接口,它可以在接收到HTTP请求后进行处理,并向客户端返回响应。在...
这个链接会指向一个`servlet`,由`servlet`来处理实际的文件读取和下载逻辑。 1. **创建Servlet**:首先,我们需要创建一个自定义的`servlet`,例如`FileDownloadServlet`。在`src`目录下的Java源代码文件中,我们...
本文将深入探讨如何在Servlet中实现文件的上传和下载功能,以及在页面上利用JSP和Javabean来实例化对象。 首先,文件上传是通过HTTP多部分请求(Multipart Request)来实现的。Servlet 3.0及以上版本提供了对这种...
### 基于Servlet的文件下载技术解析 #### 一、引言 在Web应用程序开发过程中,文件上传和下载是常见的需求之一。特别是在企业级应用中,用户经常需要下载诸如报告文档、数据备份等文件。Java Servlet作为一种强大...
本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,其中涉及到的主要技术点包括Servlet API、Multipart解析以及文件流操作。 首先,我们需要了解Servlet在文件上传中的作用。Servlet在接收到客户端(通常...
"基于Servlet实现文件的上传与下载"是一个常见的实战任务,它涵盖了网络编程、多线程和文件I/O等多个核心概念。这里我们将深入探讨如何利用Servlet来实现这两个功能。 首先,让我们了解Servlet的工作原理。Servlet...
本教程将深入讲解如何利用JSP和Servlet来实现大型文件的下载功能,这对于构建高效、稳定的Web应用至关重要。 一、Servlet简介 Servlet是Java平台上的一个标准接口,用于扩展服务器的功能。在Web开发中,Servlet通常...
Servlet技术广泛应用于文件上传和下载的功能实现,因为它们可以方便地与客户端交互并处理数据流。在本例中,我们将深入探讨如何使用Servlet来实现文件上传和下载功能。 首先,让我们了解文件上传的基本流程。当用户...
jsp、servlet 文件上传下载技术详解 文件上传下载是 Web 应用中的一种常见需求,使用 jsp 页面和 servlet 实现文件上传下载是其中的一种解决方案。下面将详细介绍 jsp、servlet 文件上传下载技术。 文件上传下载...
在本示例中,我们探讨的是如何使用Servlet来实现多文件的批量下载功能。批量下载通常涉及到将多个文件打包成一个压缩文件,然后提供给用户下载,这样可以极大地提高下载效率,尤其当用户需要下载大量小文件时。 ...
### Servlet文件下载技术详解 #### 一、Servlet简介与应用场景 Servlet是一种运行在服务器端的Java应用程序,主要用于处理客户端发送的HTTP请求,并响应相应的HTTP结果。Servlet是Java Web开发的基础,广泛应用于...
### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...
Servlet是Java Web开发中用于处理HTTP请求的一种技术,它提供了服务器端编程的能力,可以处理用户的数据交互,如文件上传、下载以及图片处理等任务。在这个项目中,我们重点关注的是Servlet如何实现文件上传、下载和...
### Servlet下载文件知识点详解 #### 一、Servlet简介与应用场景 Servlet是一种运行在服务器端的小程序,主要用于处理HTTP请求并生成动态网页。Servlet是Java Web开发的基础技术之一,广泛应用于构建动态网站和Web...
这篇博客"答Servlet下载文件的附件"可能涉及了如何利用Servlet来实现文件的下载功能,让我们深入探讨这个话题。 首先,我们需要了解Servlet生命周期中的service()方法。当一个HTTP请求到达服务器,Servlet容器(如...
本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,这对于任何Web应用程序来说都是至关重要的。 首先,我们来了解一下Servlet的基本概念。Servlet是Java编程语言中一个用于扩展服务器功能的接口,主要应用...