`

servlet下载文件不支持迅雷的解决方法

    博客分类:
  • Java
阅读更多

servlet实现下载时,如果客户端安装了迅雷,发现不能正确下载。查找原因后发现是http头设置的问题,如文件类型CONTEN-TYPE、文件长度CONTEN-LENGTH。

具体解决如下:

 

response.setHeader("Content-Disposition", "attachment;filename=" + browName);
response.setContentLength(fileSize);
response.setContentType(contentType);
byte[] fileByte = new byte[1024];
while (fileInputStream.read(fileByte) > 0){
	out.write(fileByte, 0, fileByte.length);
}
out.flush();
out.close();
out = null;
 

其中,

response.setContentLength(fileSize);
response.setContentType(contentType);

两句是关键。

 

另外,如果不想使用讯雷监控附件下载,可以取消讯雷对IE的监控。方法如下图所示

 

========================================

 

关于下载中文文件名的问题,不同浏览器需要使用不同的编码,下载前要在Java中进行文件名编码,实现如下:

 

	private static String encodeFileName(HttpServletRequest req, String name)
			throws UnsupportedEncodingException {
		String agent = req.getHeader("USER-AGENT").toLowerCase();

		if (agent != null
				&& agent.indexOf("firefox") < 0
				&& agent.indexOf("safari") < 0) {
			return URLEncoder.encode(name, "UTF8");
		}

		return new String(name.getBytes("UTF-8"), "ISO8859-1");
	}

 在多数浏览器中使用 UTF8 ,而在 firefox 和 safari 中使用 ISO8859-1 。经测试在 IE、Firefox、Chorme、Safari、Opera 上都能正常显示中文文件名(只测试了较新的浏览器)。

 

  • 大小: 42.7 KB
分享到:
评论
5 楼 boreas_baosj 2009-12-16  
问题解决了,下载的代码没有问题,是请求的路径中加了其它参数,而下载工具会不断的请求导致第二次得不到路径中参数的值,因为我是用post请求,改成get就OK
4 楼 boreas_baosj 2009-12-15  
网速不好多点了几下 
3 楼 boreas_baosj 2009-12-15  
protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String path = request.getParameter("path");
		try {
			String fileName = request.getParameter("fileName").trim();
			int c = fileName.lastIndexOf(".");
			String name = fileName.substring(0, c > 0 ? c : fileName.length())
					+ "."
					+ path.substring(path.lastIndexOf(".") + 1, path.length());

			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachement;filename="
					+ new String(name.getBytes("GBK"), "ISO-8859-1"));
			File file = new File(Const.getCurrentUtterlyPath() + path);
			if (!file.exists()) {
				throw new IOException(fileName + ",所下载的文件不存在!");
			}
			response.setContentLength(Integer.parseInt(file.length() + ""));
			InputStream fs = new FileInputStream(file);
			OutputStream os = response.getOutputStream();
			byte[] buff = new byte[1024];
			int readCount = 0;
			while ((readCount = fs.read(buff)) != -1) {
				os.write(buff, 0, readCount);
			}
			if (fs != null) {
				fs.close();
			}
			if (os != null) {
				os.close();
			}
		} catch (IOException e) {
			LOG.error("error: " + e.getMessage() + ",path: " + path);
			throw e;
		}
		response.setStatus(response.SC_OK);
		response.flushBuffer();
	}

2 楼 boreas_baosj 2009-12-15  
protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String path = request.getParameter("path");
		try {
			String fileName = request.getParameter("fileName").trim();
			int c = fileName.lastIndexOf(".");
			String name = fileName.substring(0, c > 0 ? c : fileName.length())
					+ "."
					+ path.substring(path.lastIndexOf(".") + 1, path.length());

			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachement;filename="
					+ new String(name.getBytes("GBK"), "ISO-8859-1"));
			File file = new File(Const.getCurrentUtterlyPath() + path);
			if (!file.exists()) {
				throw new IOException(fileName + ",所下载的文件不存在!");
			}
			response.setContentLength(Integer.parseInt(file.length() + ""));
			InputStream fs = new FileInputStream(file);
			OutputStream os = response.getOutputStream();
			byte[] buff = new byte[1024];
			int readCount = 0;
			while ((readCount = fs.read(buff)) != -1) {
				os.write(buff, 0, readCount);
			}
			if (fs != null) {
				fs.close();
			}
			if (os != null) {
				os.close();
			}
		} catch (IOException e) {
			LOG.error("error: " + e.getMessage() + ",path: " + path);
			throw e;
		}
		response.setStatus(response.SC_OK);
		response.flushBuffer();
	}
1 楼 boreas_baosj 2009-12-15  
最近用servelt写了一个小东西,管理文件的,设置了response.setContentType("application/octet-stream");和response.setContentLength(Integer.parseInt(file.length() + ""));使用下载工具的时候就有问题,直接用浏览器保存就可以,不可能让客户在迅雷的浏览器监视中去取消吧,LZ应该看得出来文件名称是允许用户修改的,而且不限制重名,但是在服务器上的路径文件名是重新生成的,所以也不能放在WebContent下直接通过链接路径下载,网上找了很多都不是讲到点子上的,不知道可不可以在java代码中屏蔽掉下载工具呢?请问LZ有什么可以解决的方法吗?谢了
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String path = request.getParameter("path");
		try {
			String fileName = request.getParameter("fileName").trim();
			int c = fileName.lastIndexOf(".");
			String name = fileName.substring(0, c > 0 ? c : fileName.length())
					+ "."
					+ path.substring(path.lastIndexOf(".") + 1, path.length());

			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachement;filename="
					+ new String(name.getBytes("GBK"), "ISO-8859-1"));
			File file = new File(Const.getCurrentUtterlyPath() + path);
			if (!file.exists()) {
				throw new IOException(fileName + ",所下载的文件不存在!");
			}
			response.setContentLength(Integer.parseInt(file.length() + ""));
			InputStream fs = new FileInputStream(file);
			OutputStream os = response.getOutputStream();
			byte[] buff = new byte[1024];
			int readCount = 0;
			while ((readCount = fs.read(buff)) != -1) {
				os.write(buff, 0, readCount);
			}
			if (fs != null) {
				fs.close();
			}
			if (os != null) {
				os.close();
			}
		} catch (IOException e) {
			LOG.error("error: " + e.getMessage() + ",path: " + path);
			throw e;
		}
		response.setStatus(response.SC_OK);
		response.flushBuffer();
	}

相关推荐

    java jsp+servlet实现文件下载(而不是在网页中显示出文件内容) 迅雷下载功能.zip

    本项目的核心是实现文件下载功能,而不是在浏览器中显示文件内容,尤其针对迅雷这样的第三方下载工具进行优化。下面我们将深入探讨如何使用Java的这些技术来实现这一目标。 首先,`jsp`是Java的一个视图技术,主要...

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    当你遇到“找不到javax.servlet.*”这样的错误时,通常是因为你的项目缺少了这个库,所以需要引入`javax.servlet.jar`来解决问题。 1. **Java Servlet简介** Java Servlet是Java平台上的一个标准,用于扩展服务器...

    servlet 文件上传下载例子

    在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...

    servlet文件下载项目

    在这个"Servlet文件下载项目"中,我们利用Servlet技术来实现文件的下载功能。这是一个非常实用的功能,尤其对于那些需要向用户提供文件下载服务的网站或应用。 首先,我们需要了解Servlet的基本工作原理。Servlet是...

    java servlet实现文件下载

    本示例中,我们将探讨如何使用Java Servlet来实现文件的下载功能。 首先,理解HTTP协议是至关重要的,因为它定义了客户端(浏览器)与服务器之间的通信方式。在文件下载场景中,服务器需要响应一个HTTP请求,该请求...

    servlet下载文件

    ### Servlet下载文件知识点详解 #### 一、Servlet简介与应用场景 Servlet是一种运行在服务器端的小程序,主要用于处理HTTP请求并生成动态网页。Servlet是Java Web开发的基础技术之一,广泛应用于构建动态网站和Web...

    答Servlet下载文件的附件

    这篇博客"答Servlet下载文件的附件"可能涉及了如何利用Servlet来实现文件的下载功能,让我们深入探讨这个话题。 首先,我们需要了解Servlet生命周期中的service()方法。当一个HTTP请求到达服务器,Servlet容器(如...

    ajax+json+servlet下载

    在IT行业中,Ajax(Asynchronous JavaScript and XML)技术是一种用于创建快速、动态网页的重要方法,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。结合JSON(JavaScript Object ...

    基于servlet的文件下载代码

    ### 基于Servlet的文件下载技术解析 #### 一、引言 在Web应用程序开发过程中,文件上传和下载是常见的需求之一。特别是在企业级应用中,用户经常需要下载诸如报告文档、数据备份等文件。Java Servlet作为一种强大...

    Servlet中文件上传和下载

    Servlet 3.0及以上版本提供了对这种请求的内置支持,我们可以通过`HttpServletRequest`接口的`getParts()`方法来获取上传的文件。以下是一个简单的文件上传Servlet示例: ```java @WebServlet("/FileUploadServlet...

    servlet上传下载文件

    Servlet技术广泛应用于文件上传和下载的功能实现,因为它们可以方便地与客户端交互并处理数据流。在本例中,我们将深入探讨如何使用Servlet来实现文件上传和下载功能。 首先,让我们了解文件上传的基本流程。当用户...

    中文版Servlet帮助文档

    在服务器启动时,Servlet容器会根据web.xml配置文件加载Servlet,并调用init()方法进行初始化。之后,每当收到HTTP请求,Servlet容器都会调用service()方法来处理请求。最后,当服务器关闭或者Servlet不再需要时,会...

    jsp,servlet上传下载文件

    文件上传下载是 Web 应用中的一种常见需求,使用 jsp 页面和 servlet 实现文件上传下载是其中的一种解决方案。下面将详细介绍 jsp、servlet 文件上传下载技术。 文件上传下载原理 文件上传下载的原理是将客户端的...

    jsp传参 servlet接收中文乱码问题的解决方法.docx

    jsp 传参 servlet 接收中文乱码问题的解决方法 jsp 传参 servlet 接收中文乱码问题是一个经常遇到的问题,特别是在使用 Hibernate+Servlet 框架时。当我们在 jsp 页面传参到 servlet 时,中文字符经常会出现乱码...

    servlet实现文件上传下载

    总结来说,实现Servlet文件上传下载需要理解Servlet生命周期、HTTP请求处理、多部分数据解析以及文件I/O操作。Apache Commons FileUpload库简化了这一过程,但理解其背后的原理对于解决可能出现的问题和优化性能至关...

    【Demo Project】ajaxSubmit+Servlet表单文件上传和下载

    【AjaxSubmit+Servlet实现表单文件上传与下载详解】 在Web开发中,文件上传和下载是常见的功能,尤其是在用户交互丰富的应用中。本项目【Demo Project】利用AjaxSubmit结合Servlet技术,提供了一种高效、异步的方式...

    文件上传与下载servlet

    在IT行业中,文件上传与下载是Web应用中常见的功能,特别是在企业级系统中,例如文档管理系统、在线教育平台等。Servlet作为Java Web开发中的一个重要组件,常被用来处理这些操作。下面将详细介绍如何使用Servlet...

    jsp+servlet实现大型文件下载

    本教程将深入讲解如何利用JSP和Servlet来实现大型文件的下载功能,这对于构建高效、稳定的Web应用至关重要。 一、Servlet简介 Servlet是Java平台上的一个标准接口,用于扩展服务器的功能。在Web开发中,Servlet通常...

    Servlet实现多文件批量下载

    在本示例中,我们探讨的是如何使用Servlet来实现多文件的批量下载功能。批量下载通常涉及到将多个文件打包成一个压缩文件,然后提供给用户下载,这样可以极大地提高下载效率,尤其当用户需要下载大量小文件时。 ...

    jsp+servlet实现文件上传下载

    ### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...

Global site tag (gtag.js) - Google Analytics