package baiyang;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Download
*/
@WebServlet("/download/*")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownloadServlet() {
super();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("GBK");
String requestUrl = new String(URLDecoder.decode(request.getRequestURI(), "UTF-8"));
System.out.println("请求地址" + requestUrl);
if (requestUrl.endsWith("/download/") || requestUrl.endsWith("/download")) {
PrintWriter pw = response.getWriter();
Error404(pw);
return;
}
// 获取文件
String filePath = this.getServletConfig().getServletContext().getRealPath("/") + requestUrl.substring(requestUrl.indexOf("/download") + 10);
System.out.println("文件路径:" + filePath);
File file = new File(filePath);
if (!file.exists()) {
System.out.println("文件“" + file.getAbsolutePath() + "”不存在!");
PrintWriter pw = response.getWriter();
Error404(pw);
return;
}
OutputStream os = response.getOutputStream();
long start = 0;
String range = request.getHeader("range");
if (range != null) {
System.out.println("range=" + range);
String rg = range.split("=")[1];
start = Long.parseLong(rg.split("-")[0]);
response.setStatus(206);
}
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Range", "bytes " + start + "-" + (file.length() - 1) + "/" + file.length());
response.setHeader("Content-Length", " " + file.length());
response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(file.getName().getBytes(), "ISO-8859-1") + "\"");
InputStream is = new FileInputStream(file);
System.out.println("start=" + start);
is.skip(start);
byte[] buffer = new byte[1024 * 64];
int len = 0;
while ((len = is.read(buffer, 0, buffer.length)) != -1) {
os.write(buffer, 0, len);
}
os.flush();
os.close();
is.close();
System.out.println("下载完成!");
}
private static void Error404(PrintWriter pw) {
String msg = "<html><title>未找到……</title><body>";
msg += "<div style='color:red;text-align:center'>抱歉!未找到您要下载的资源……<br><input type='button' value='返回' onclick='javascrip:history.go(-1)'></div>";
msg += "</body></html>";
pw.write(msg);
pw.flush();
pw.close();
}
}
Servlet断点续传下载
最新推荐文章于 2022-12-08 18:15:28 发布