javaweb如何实现⽂件下载功能?
⼀、超链接下载:
这种⽅式⾮常简单,就是在超链接⾥⾯写上即将下载的⽂件路径,我这⾥将⽂件放在webapp下⾯的download⽂件夹⾥⾯:
<a href="download/notice1.pdf"></a>
但是有⼀个弊端就是,如果下载的⽂件可以直接被浏览器识别就会⾃动打开,⽐如.png,.pdf⽂件,如果是.zip等⽂件,则不会打开。
⼆、Servlet下载:
为了解决第⼀种⽅式的弊端,我们采取Servlet下载⽅式。
1.新建Servlet⽂件,可以命名为DownloadServlet,映射url是“/downloadServlet”,我的项⽬名称是suiningAdmissions;
2.在DownloadServlet中加⼊以下内容,其中filename是你在下载的时候需要传递的参数,是你即将下载的⽂件的名称;
package cn.itIcey.suining.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
web下载官方下载
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得请求⽂件名
String filename = Parameter("filename");
System.out.println(filename);
//设置⽂件MIME类型
response.setContentType(getServletContext().getMimeType(filename));
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//读取⽬标⽂件,通过response将⽬标⽂件写到客户端
//获取⽬标⽂件的绝对路径
String fullFileName = getServletContext().getRealPath("/download/" + filename);
//System.out.println(fullFileName);
//读取⽂件
InputStream in = new FileInputStream(fullFileName);
OutputStream out = OutputStream();
byte[] buffer = new byte[1024];
int len;
/
/循环取出流中的数据
while((len = in.read(buffer)) != -1){
out.write(buffer,0,len);
}
in.close();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.将下载链接重新设置,其中/suiningAdmission/downloadServlet是我创建的Servlet的映射路径,注意⼀定要把前⾯的项⽬名称加上去!filename后⾯的内容就是下载的⽂件名称。
<a href="/suiningAdmissions/downloadServlet?filename=notice3.pdf"
4.于是就可以下载啦!