There are two types of Web file downloads, one is the file in the Web site directory, in the browser directly enter the file path can be downloaded, such as Http://www.xxx.com/file.zip. The other is that the file is not in the site directory or the file is dynamically generated (export reports or export Excel, etc.), this situation requires the response OutputStream implementation of the file download. Downloadutils is a Java web file Download tool class that provides a variety of static methods to implement file downloads.
Package com.rhui.util;
Import Java.io.BufferedInputStream;
Import Java.io.BufferedOutputStream;
Import Java.io.File;
Import Java.io.FileInputStream;
Import java.io.IOException;
Import Java.io.InputStream;
Import Java.io.OutputStream;
Import Java.net.URLEncoder;
Import Javax.servlet.http.HttpServletResponse;
Import Org.apache.commons.lang3.StringUtils; /** * File Download class */public class Downloadutils {/** * File download code * This code tells the browser file name encoding, in case of downloading Chinese file name is garbled * * * * privat
e static String encoding = "Utf-8"; /** * File Download * @param response * @param filePath file path on the server, including filename/public static void Download (Httpserv
Letresponse response, String filePath) {File File = new file (filepath.tostring ());
Download (response, file, null, encoding); /** * File Download * @param response * @param filePath files on the server path, including file name * @param filename File download to the browser name, if If you do not want the browser to download the same file name as the file name on the server, set this parameter/public static void Download (HttpservLetresponse response, String FilePath, String fileName) {File File = new file (filepath.tostring ());
Download (response, file, FileName, encoding); /** * File Download * @param response * @param filePath files on the server path, including file name * @param filename File download to the browser name, if If you do not want the browser to download the same file name as the file name on the server, set the parameter * @param encoding file name encoding/public static void download (HttpServletResponse re
Sponse, String FilePath, String fileName, string encoding) {File File = new file (filepath.tostring ());
Download (response, file, FileName, encoding); /** * File Download * @param response * @param file * @param fileName file download to the browser name, if you do not want to let the browser download the file name and the server File name, please set this parameter/public static void Download (httpservletresponse response, file file) {Download (Response, fil
E, NULL, encoding); /** * File Download * @param response * @param file * @param fileName file download to the browser name, if you do not want to let the browser download the file name and the server File name, please set this parameter/public static void DowNload (httpservletresponse response, file file, String filename) {Download (response, file, filename, encoding); /** * File Download * @param response * @param file * @param fileName file download to the browser name, if you do not want to let the browser download the file name and the server File name, please set this parameter * @param encoding file name encoding/public static void Download (httpservletresponse response, file file,
String FileName, String encoding {if (file = = NULL | |!file.exists () | | | file.isdirectory ()) {return;
//If you do not specify the name of the file to download to the browser, use the default name of the file if (Stringutils.isblank (fileName)) {filename = File.getname ();
The try {InputStream is = new FileInputStream (file);
Download (response, is, fileName, encoding);
catch (IOException e) {e.printstacktrace (); }/** * File download * @param response * @param is file input stream * @param filename downloaded file name * @throws Ioexc Eption */public static void Download (HttpServletResponse response, InputStream is, String fileName) {Download (response, is, filename, encoding); /** * File Download * @param response * @param is file input stream * @param filename Download file name * @param encoding encoding
Format */public static void Download (HttpServletResponse response, InputStream is, string fileName, string encoding) { if (is = = NULL | |
Stringutils.isblank (FileName)) {return;
} Bufferedinputstream bis = null;
OutputStream OS = null;
Bufferedoutputstream BOS = NULL;
try{bis = new Bufferedinputstream (IS);
OS = Response.getoutputstream ();
BOS = new Bufferedoutputstream (OS);
Response.setcontenttype ("application/octet-stream;charset=" + encoding);
response.setcharacterencoding (encoding);
Response.setheader ("Content-disposition", "attachment;filename=" + urlencoder.encode (filename, encoding));
byte[] buffer = new byte[1024];
int len = bis.read (buffer); while (Len!=-1) {Bos.writE (buffer, 0, Len);
Len = bis.read (buffer);
} bos.flush ();
}catch (IOException e) {e.printstacktrace ();
}finally{if (bis!= null) {try{bis.close ();
}catch (IOException e) {}} if (is!= null) {try{is.close ();
}catch (IOException e) {}}} public static String GetEncoding () {return encoding;
The public static void Setencoding (String encoding) {downloadutils.encoding = encoding;
}
}
If the file is saved in the server's non-web directory
String FilePath = "C:\\file.zip";
Downloadutils.download (response, FilePath);
If the file is an input stream
is the file input stream
//filename for the browser to download the file name
//encoding for the file name code, to prevent the file in the Chinese language produced garbled
String fileName = "File.zip";
String encoding = "Utf-8";
Downloadutils.download (response, is, fileName, encoding);
File downloads in servlet
Package com.rhui.web.servlet;
Import java.io.IOException;
Import javax.servlet.ServletException;
Import Javax.servlet.annotation.WebServlet;
Import Javax.servlet.http.HttpServlet;
Import Javax.servlet.http.HttpServletRequest;
Import Javax.servlet.http.HttpServletResponse;
Import Com.rhui.util.DownloadUtils;
@WebServlet ("/download/servlet") public
class Downloadservlet extends HttpServlet {
private static final long Serialversionuid = 1L;
protected void Service (HttpServletRequest request, httpservletresponse response) throws Servletexception, IOException {
String FilePath = "C:\\file.zip";
Downloadutils.download (response, FilePath);
}
PS: Picture download (including anti-theft chain function)
Package cn.itcast.day06.web.servlet;
Import java.io.IOException;
Import Java.io.InputStream;
Import Java.io.OutputStream;
Import Java.net.URLEncoder;
Import Javax.servlet.ServletContext;
Import javax.servlet.ServletException;
Import Javax.servlet.http.HttpServlet;
Import Javax.servlet.http.HttpServletRequest;
Import Javax.servlet.http.HttpServletResponse; public class Downloadservlet extends HttpServlet {public void doget (HttpServletRequest request, HttpServletResponse re Sponse) throws Servletexception, IOException {//Implement anti-theft chain function//Get referer header to indicate where the visitor came from String referer = Request.geth
Eader ("Referer");
if (Referer==null | |!referer.startswith ("http://localhost")) {//Is hotlinking response.sendredirect ("/day06/index.jsp");
return; //Solve Response Chinese garbled problem Response.setcontenttype ("Text/html;charset=utf-8");
Set the message body's encoding//HTTP response message headers sent through the HTTP protocol cannot appear Chinese must go through URL encoding String filename = Urlencoder.encode ("Belle. jpg", "utf-8"); Notifies the browser to read the resource Response.setheader the way it is downloaded("Content-disposition", "attachment;filename=" +filename); Read picture data to IE browser String webpath = "/download/beauty. jpg";
The path ServletContext ServletContext = Super.getservletcontext () equivalent to the current Web application;
InputStream in = Servletcontext.getresourceasstream (Webpath);
OutputStream out = Response.getoutputstream ();
int Len;
byte[] buffer = new byte[1024];
while ((Len=in.read (buffer))!=-1) out.write (buffer, 0, Len);
public void DoPost (HttpServletRequest request, httpservletresponse response) throws Servletexception, IOException {
Doget (request, response);
}
}