java web 實現簡單下載功能
項目結構
├── src\
│ ├── a.txt
│ └── com\
│ └── demo\
│ └── web\
│ ├── Cookie\
│ ├── download\
│ ├── homework\
│ ├── servlet\
│ ├── servletcontext\
│ └── utils\
└── web\├── WEB-INF\│ ├── b.txt│ └── lib\│ └── javax.servlet.jar├── c.txt├── download.html├── htmls\│ └── location2.html├── img\│ ├── 1.avi│ ├── 2.jpg│ └── 九尾.jpg├── index.jsp├── location.html└── register.html
/**
工具類
*/
import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE瀏覽器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐瀏覽器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它瀏覽器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}/**
下載文件servlet實現
*/import com.demo.web.utils.DownLoadUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");//1、獲取文件名稱String filename = request.getParameter("filename");System.out.println(filename);//2、使用字節輸入流讀取數據到內存//2.1 獲取文件在服務器端的真實路徑ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2 讀取文件到內存File file = new File(realPath);FileInputStream fis = new FileInputStream(file);//3、指定response響應頭信息//3.1 指定響應頭類型:content-typeString mimeType = servletContext.getMimeType(realPath);//image/jpegresponse.setHeader("content-type", mimeType);//處理文件名中文亂碼問題//1、獲取客戶端使用的瀏覽器類型String agent = request.getHeader("user-agent");//2、調用工具類,返回一個文件名稱filename = DownLoadUtils.getFileName(agent, filename);//3.2 指定響應頭的打開方式response.setHeader("content-disposition", "attachment;filename=" + filename);//4、將數據寫出到response輸出流ServletOutputStream sos = response.getOutputStream();byte[] buff = new byte[1024 * 8];//緩沖區int len = 0;while ((len = fis.read(buff)) != -1) {sos.write(buff,0,len);}fis.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}
前端
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>下載文件</title>
</head>
<body><a href="/img/2.jpg">圖片1</a><a href="/img/九尾.jpg">圖片2</a><hr><a href="/downloadServlet?filename=九尾.jpg">下載圖片1</a><a href="/downloadServlet?filename=2.jpg">下載圖片2</a></body>
</html>
工具類
import java.io.File;
import java.io.IOException;/*** File類的使用*/
public class FileTest {/*** 創建文件** @param filename 文件名*/public File createFile(String filename) throws IOException {//1、創建file對象File file = new File(filename);//判斷文件是否存在if (!file.exists()) {//2、調用方法創建文件file.createNewFile();}return file;}/*** 創建目錄** @param pathname*/public void createDir(String pathname) {File file = new File(pathname);if (!file.exists()) {//1、第一種方式:創建目錄,只能創一級目錄
// file.mkdir();//1、第二種方式:創建目錄,可以創建多級目錄file.mkdirs();}}/*** 刪除文件** @param filename 文件名*/public void delFile(String filename) {File file = new File(filename);if (file.exists()) {file.delete();System.out.println("刪除成功!");} else {System.out.println(file.getName() + "不存在!");}}/*** 遍歷文件的路徑* @param filename 文件名*/public void outFilePath(String filename) {File file = new File(filename);String path = file.getAbsolutePath();String path1 = file.getPath();System.out.println(path);System.out.println(path1);}/*** 遍歷目錄中所有的文件和目錄** @param filename 文件名*/public void listDir(String filename) {File file = new File(filename);//判斷是否是目錄if (file.isDirectory()) {//遍歷目錄File[] files = file.listFiles();
// System.out.println("文件的個數" + files.length);//跳出的條件if (null == files || files.length == 0) {return;} else {for (File file1 : files) {if (file1.isDirectory()) {System.out.println("目錄是----" + file1.getName());//遞歸算法listDir(file1.getAbsolutePath());} else {System.out.println("文件是---" + file1.getName());}}}} else {System.out.println("文件是---" + file.getName());}}/*** 給指定的文件重命名** @param filename 文件名*/public void renameFile(String filename) {File file = new File(filename);file.renameTo(new File("g://a//aa.txt"));}public static void main(String[] args) {FileTest ft = new FileTest();ft.renameFile("g://a//a.txt");
// ft.listDir("g://apache-tomcat-8.0.36");
// ft.outFilePath("g://a//b//b.txt");
// try {
// ft.createFile("g://a.txt");
// } catch (IOException e) {
// e.printStackTrace();
// }
// ft.createDir("g://a//b");
// ft.delFile("g://a.txt");}
}import java.io.*;/*** java中的I/O流*/
public class IODemo {public static void main(String[] args) throws IOException {IODemo demo = new IODemo();demo.copyFile("g://a//aa.txt","g://a//b//aa.txt");
// demo.writeFile("g://a//a.txt");
// demo.readFile("g://a//aa.txt");}/**** 讀操作* @param filename 文件名*/public void readFile(String filename) throws IOException {/*** 第一種方式*/
// File file = new File(filename);
// //1、創建一個字節讀流的對象
// FileInputStream fis = new FileInputStream(file);
// int len = 0;//讀取的字節數
// //2、讀文件: 文件如果讀到末尾返回為-1
// while ((len = fis.read()) != -1) {
// System.out.print((char)len);
// }
// //關閉流
// fis.close();/*** 第二種方式*/File file = new File(filename);FileInputStream fis = new FileInputStream(file);//定義一個緩沖區byte[] buff = new byte[1024 * 8];int len = 0;//讀取的字節數while ((len = fis.read(buff)) != -1) {System.out.write(buff, 0, len);}//關閉流fis.close();}//寫操作public void writeFile(String filename) throws IOException {//1、創建一個字節輸出流對象:追加內容,需要傳入第二個參數FileOutputStream fos = new FileOutputStream(new File(filename), true);//2、寫文件String str = "--這是追加的內容!";fos.write(str.getBytes());
// fos.write(100);//強制從緩沖區中把數據寫入到文件中fos.flush();//關閉流fos.close();}//拷貝文件:邊讀邊寫的過程public void copyFile(String srcFile, String deFile) throws IOException {//1、創建字節輸入流對象File file = new File(srcFile);FileInputStream fis = new FileInputStream(file);//2、創建字節輸出流對象File file1 = new File(deFile);FileOutputStream fos = new FileOutputStream(file1);//3、使用輸入流讀取文件到內存byte[] buff = new byte[1024 * 8];int len = 0;//讀取的字節數while ((len = fis.read(buff)) != -1) {//4、邊讀邊寫fos.write(buff,0,len);fos.flush();}//5、反向關閉流fos.close();fis.close();}}