下載文件
- 創建獲取文件列表Servlet,首次訪問時request中沒有目錄參數,需要給個默認目錄。遍歷該目錄下文件,創建對應的文件對象(包含文件名,文件/文件夾,絕對路徑等屬性),添加到List中,并把List保存到域中。轉發到文件列表jsp中
private static List<FileJavaClass> fileList = new ArrayList<>();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取參數中的filePath
String filePath = request.getParameter("filePath");
//如果參數中沒有filePath,說明是首次訪問,設置filePath為根目錄
if (filePath == null || filePath.isEmpty()) {
filePath = "D:/download";
}
//判斷是否是根目錄,并保存在域中,用于判斷是否顯示返回按鈕
if (filePath.equalsIgnoreCase("D:/download") || filePath.equalsIgnoreCase("D:\\download")) {
request.setAttribute("isRoot", true);
}else {
request.setAttribute("isRoot", false);
}
File file = new File(filePath);
//在域中保存上級目錄,用于返回上級目錄
request.setAttribute("parent", file.getParentFile());
File[] files = file.listFiles();
//先清空List再想List中添加該目錄下遍歷出來的文件
fileList.clear();
if (files != null && files.length > 0) {
for (File file2 : files) {
//創建自定義的保存文件關鍵屬性的對象
FileJavaClass fileJavaClass = new FileJavaClass();
//保存文件的名字
fileJavaClass.setName(file2.getName());
//保存文件的絕對路徑
fileJavaClass.setPath(file2.getPath());
//保存文件是文件或文件夾,用于判斷文件的操作是打開還是下載
fileJavaClass.setIsFile(file2.isFile());
//添加到List中
fileList.add(fileJavaClass);
}
}
//List保存到域中
request.setAttribute("fileList", fileList);
//轉發到文件列表jsp中
request.getRequestDispatcher("/downloadlist.jsp").forward(request, response);
}
- 創建展示文件列表jsp
<body>
<!-- 判斷是否是根目錄,決定是否顯示返回按鈕 -->
<c:choose>
<c:when test="${isRoot==false}">
<a href="${pageContext.request.contextPath}/DownloadListServlet?filePath=${parent}">返回</a>
</c:when>
</c:choose>
<!-- 列表 -->
<table border="1" width="500">
<tr>
<th>編號</th>
<th>文件名</th>
<th>操作</th>
</tr>
<!-- 遍歷域中保存的List -->
<c:forEach items="${fileList}" var="v" varStatus="vs">
<tr>
<td>${vs.count}</td>
<td>${v.name}</td>
<c:choose>
<!-- 如果是文件就顯示下載并超鏈接到下載Servlet,參數為文件的絕對路徑和文件名 -->
<c:when test="${v.isFile}">
<td>
<a href="${pageContext.request.contextPath}/DownloadServlet?filePath=${v.path}&fileName=${v.name}">下載</a>
</td>
</c:when>
<!-- 如果是文件夾就顯示打開并超鏈接到文件列表Servlet,參數為文件夾的絕對路徑 -->
<c:otherwise>
<td>
<a href="${pageContext.request.contextPath}/DownloadListServlet?filePath=${v.path}">打開</a>
</td>
</c:otherwise>
</c:choose>
</tr>
</c:forEach>
</table>
</body>
- 創建下載Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取文件路徑參數
String filePath = request.getParameter("filePath");
//獲取文件名,用于給響應頭設置默認文件名
String fileName = request.getParameter("fileName");
//根據文件的路徑創建輸入流
InputStream in = new FileInputStream(filePath);
//處理文件名
fileName = URLEncoder.encode(fileName, "utf8");
//下載文件需要給響應頭設置參數
response.setHeader("content-disposition", "attachment;fileName=" + fileName);
//獲取輸出流
ServletOutputStream out = response.getOutputStream();
byte[] buff = new byte[1024];
Integer length = -1;
while((length = in.read(buff)) != -1) {
out.write(buff, 0, length);
}
in.close();
out.close();
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。