java—servlet实现文件下载功能

最近在学javaweb技术,利用所学知识做了一个简单的项目,在服务器上实现给用户下载文件的功能。自动列出文件夹下的文件提供下载,支持中文文件名。

结果图

其中使用了tomcat来部署服务器,代码中应用了少许EL表达式和JSTL标签,使用了jsp和servlet,当然还有java和http的基础知识,但是个人觉得重点是http的Content-Disposition头信息和Content-type头信息在servlet中下载方面的应用,详见DownloadPageServlet.java源码。

关于Content-Disposition,可以参考一篇博客:Avatasia的博客http://www.cnblogs.com/jzaileen/articles/1281025.html

讲解的比较详细,但是代码貌似不是java的。

关于Content-type,可以参考在线工具:

http://tool.oschina.net/commons

本项目包含一个jsp文件,用来展示可下载的文件列表,显示为超链接,用户点击即可下载对应文件。一个javabean,用来储存可供用户下载的文件和文件名。一个servlet,用来提供下载功能。

Jsp中超链接的实现方式:指向servlet,在网址后面附加参数,servlet可以根据附加参数知道用户想要下载哪个文件。

结构图

备注1.本人觉得项目结构并不是很好,还望指教。

2.不知道有没有方便的专用作图软件。

如果读者对上面2个问题有所了解的话还望指导。

在myeclipse中新建一个web程序,添加下述3个文件,修改一下包名错误,在web.xml中配饰上servlet,访问jsp文件,应该就可以看到效果了。

DownloadPageServlet.java源码

package com.ima.downLoad;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ima.downLoad.util.FilesBean;

public class DownloadPageServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		//理论上传来的网址是 ?后面跟一个数字表示第n个文件
		String str = request.getQueryString();
		//如果没有参数则什么也不做
		if (str != null) {
			FilesBean bean = new FilesBean();
			File f = null;
			try {
				f = bean.getFiles().get(Integer.valueOf(str) - 1);
			} catch (Exception e) {
				// 没有对应文件会抛出数组越界异常
				e.printStackTrace();
				return;
			}
			System.out.println("DownloadPageServlet:用户欲得到的资源是  " + f.getName());
			if (f != null) {
				BufferedInputStream bis = null;
				try {
					// 得到文件输入流
					bis = new BufferedInputStream(new FileInputStream(f));
					// !!!
					//设置http头信息为文件下载
					//!!!保证在下一步之前,我曾经写在下一步之后,不能正常实现功能
					response.setContentType("application/octet-stream");

					response.addHeader(
							"Content-Disposition",
							"attachment;filename="
									+ URLEncoder.encode(f.getName(), "UTF-8"));
					// 得到应答输出流,并写入
					ServletOutputStream os = response.getOutputStream();
					byte[] buf = new byte[1024 * 8];
					int len = -1;
					while ((len = bis.read(buf)) != -1) {
						os.write(buf, 0, len);
					}
				} catch (Exception e) {
				} finally {
					if (bis != null)
						bis.close();
				}
			}
		}
	}

}

FileBean.java源码

package com.ima.downLoad.util;

import java.io.File;
import java.util.ArrayList;

/**
 * 获得指定文件夹下的文件,生成list,对外提供文件list和文件名list
 * @author tor
 *
 */
public class FilesBean {
	private String targetDir = "E:/imaLearn/8组共享/";
	//下面2个list应该是同步的
	//文件list,用来读取
	ArrayList<File> files = new ArrayList<File>();
	//文件名list,用来显示
	ArrayList<String> fileNames = new ArrayList<String>();

	public FilesBean() {
		init();
	}

	public ArrayList<String> getFileNames() {
		return fileNames;
	}

	/**
	 * 初始化函数,每次改变相关参数需要调用
	 */
	private void init() {
		File[] fileList = new File(targetDir).listFiles();
		for (File file : fileList) {
			if (file.canRead() && file.canWrite() && !file.isHidden()) {
				files.add(file);
				fileNames.add(file.getName());
			}
		}
	}

	public String getTargetDir() {
		return targetDir;
	}

	public void setTargetDir(String targetDir) {
		this.targetDir = targetDir;
		init();//重新初始化
	}

	public ArrayList<File> getFiles() {
		return files;
	}

}

showFiles.jsp源码

<%@page import="com.ima.downLoad.util.FilesBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib  uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>下载资源页面</title>
</head>
<body>
<h3>8组共享</h3><br/>
<%request.setAttribute("fileBean", new FilesBean()); %>
<c:forEach items="${fileBean.fileNames }" var="file" varStatus="state">
<a target="_blank" href="${pageContext.request.contextPath }/servlet/DownloadPageServlet?${state.count }">${file }</a><br/>
</c:forEach>

</body>
</html>

java—servlet实现文件下载功能

时间: 2024-10-23 16:19:18

java—servlet实现文件下载功能的相关文章

java servlet开发购物车功能,实现增删改查结算等功能。

原文:java servlet开发购物车功能,实现增删改查结算等功能. 源代码下载地址:http://www.zuidaima.com/share/1550463494130688.htm 购物车功能:增删改查,结算等功能,主要技术为:servlet对数据库的访问... 源代码截图:

亲身实测可用的java实现wordxlsxpdf文件下载功能

本文参考原文-http://bjbsair.com/2020-03-22/tech-info/3621/在SpringMVC的开发过程中,有时需要实现文档的下载功能.word,excel,pdf作为大家最常用的办公程序,它的文件传输就显得尤为重要,本文通过使用spring 提供的Resource封装来实现实现word/xlsx/pdf文件下载功能.话不多说. package com.davidwang456; import java.io.File; import javax.servlet.h

【Servlet】java web 文件下载功能实现

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 [html] view plain copy <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body&

JAVA文件下载功能问题解决日志

今天给报告系统做了个下载功能,遇到了挺多问题,通过查资料一一解决了. 1.首先遇到的问题是:java后台的输出流输出之后,没有任何报错,浏览器端不弹出保存文件的对话框,原本是ajax请求到后台的controller方法中添加了下载的方法,type和async两个参数的四种组合都不行,弃用ajax,用window.location.href='file/download?path='+file;重新发一个新的下载请求之后,保存对话框终于弹出. 2.弹出之后,发现文件名乱码,后台的解决方案代码如下:

java web文件下载功能实现

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通过链接下载文件&

Spring Boot入门(10)实现文件下载功能

??在这篇博客中,我们将展示如何在Spring Boot中实现文件的下载功能. ??还是遵循笔者写博客的一贯风格,简单又不失详细,实用又能让你学会. ??本次建立的Spring Boot项目的主要功能为文件下载,而且这也是唯一功能,当然,作为例子,要尽可能简单,所以,功能简化为只下载E盘music_eg目录下的某一个文件. ??该Spring Boot项目的名称为file_download,其具体结构如下: build.gradle文件的代码如下: buildscript { ext { spr

JavaWeb之Java Servlet完全教程(转)

Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servlet必须部署在Java servlet容器才能使用.虽然很多开发者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet.也就是说,了解Java Servle

Java Servlet系列之Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(): 2. service()方法 它是Servlet的核心,每当

Java中都通用文件下载(ContentType、文件头、response、out四步骤)

Java中都通用文件下载(ContentType.文件头.response.out四步骤) 新浪微博:IT国子监(记得关注噢) http://weibo.com/itguozijian   我们就直接切入主题啦,文件下载只需要四步: 1.设置文件ContentType类型 2.设置文件头 3.通过response获取ServletOutputStream对象(out) 4.写到输出流(out)中 下载代码: 这里我使用的是SpringMVC,不过它在这里的唯一用途就是用来获取ServletCon