1. 程式人生 > >JavaWeb檔案的上傳和下載

JavaWeb檔案的上傳和下載

                                                                            檔案的上傳

servlet3.0本身具有檔案上傳功能
這裡我們使用第三方開源 fileupload

實現檔案的上傳

後臺實現上傳功能類:(當檔案上傳的時候,後臺需要去解析請求物件【資料仍然在請求物件中】)

/**
 * fileupload實現檔案上傳功能步驟:
 * ①匯入jar包,建立上傳頁面   commons-fileupload-1.2.2.jar,commons-io-1.4.jar
 * ②解析請求型別,獲取請求中的檔案項
 * ③遍歷檔案項,判斷普通項和檔案項
 * ④獲取上傳的檔名稱
 * ⑤儲存資料:將檔案寫入到伺服器本地
 * @author 鄭清
 */
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			FileItemFactory factory = new DiskFileItemFactory();//建立檔案磁碟工廠物件
			ServletFileUpload upload = new ServletFileUpload(factory);//根據檔案磁碟工廠物件建立檔案解析器物件 
			List<FileItem> items = upload.parseRequest(req);//解析請求型別,獲得檔案項,進行檔案上傳時,分為普通項和檔案項           List<FileItem>:前端頁面提交的資料被封裝到FileItem
 
			// 遍歷  ==>  判斷資料型別
			for (FileItem fileItem : items) {
				if (fileItem.isFormField()) {	//普通項     isFormFiled:true->普通資料,false->檔案資料  
					System.out.println(fileItem.getString("UTF-8"));//獲取普通項
				} else {    //檔案項
					ServletContext context = getServletContext();
					String name = fileItem.getName();//獲取檔案上傳的名稱
					
					//判讀上傳的檔案是否是一個圖片
					String mimeType = context.getMimeType(name);
					if (mimeType==null||!mimeType.startsWith("image/")) {
						System.out.println("===不屬於圖片型別...===");
						return;
					}
					
					String extension = FilenameUtils.getExtension(name);//獲取檔案字尾名
					String newName = UUID.randomUUID().toString() + "." + extension;//防止上傳的檔案同名
					
					//servlet中 獲取到本地絕對路徑
					String realPath = context.getRealPath("/upload");

					File f = new File(realPath, newName);
					fileItem.write(f);//將檔案寫入本地
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

前端上傳頁面:
 注意:  ①需要使用post提交
              ②form表單新增屬性:
enctype="multipart/form-data"   (form表單預設不會將檔案的資料上傳,只會上傳普通的資料設定了該屬性之後,瀏覽器會將檔案資料提交給伺服器)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"   %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首頁</title>
</head>
<body>
	<h1>檔案上傳</h1>
	<form action="/zq/upload" method="post" enctype="multipart/form-data" >
		使用者名稱:<input type="text" name="username" ><br/>
		上傳頭像:<input type="file" name="imgupload" ><br/>
		<input type="submit" >
	</form>
</body>
</html>

                                                                                        檔案的下載

超連結下載

注意:如果是瀏覽器支援的檔案型別,瀏覽器會直接開啟檔案,注意:需要準備一個資料夾存放下載檔案
          也就是說如果超連結指向的資源【文件、圖片、視訊】,瀏覽器支援的檔案型別預設可以開啟,那麼瀏覽器會選擇直接開啟 ,當瀏覽器打不開資源時,就執行下載

<a href="${pageContext.request.contextPath }/download/1.txt" >下載文字文件</a><br/>
<a href="${pageContext.request.contextPath }/download/1.jpg" >下載圖片</a><br/>

程式下載

注意:前臺還是使用超連結,超連結轉到後臺servlet,在servlet通過流的方式把檔案複製到前臺

<a href="${pageContext.request.contextPath }/download?filename=1.txt" >下載文字文件</a><br/>
<a href="${pageContext.request.contextPath }/download?filename=1.jpg" >下載圖片</a><br/>

後臺實現下載功能類:

/**
 * 檔案下載:
 * ①獲取前臺要下載的檔名稱
 * ②設定響應型別
 * ③設定下載頁顯示的檔名
 * ④獲取下載資料夾的絕對路徑和檔名合併為File型別
 * ⑤將檔案複製到瀏覽器
 * @author 鄭清
 */
@WebServlet("/download")
public class DownLoadServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		String realPath = getServletContext().getRealPath("/download");//獲取下載檔案路徑
		String filename = req.getParameter("filename");//獲取前臺傳過來的名稱
		File file = new File(realPath,filename);//把下載檔案構成一個檔案處理
		
		//設定響應型別  ==》 告訴瀏覽器當前是下載操作,我要下載東西
		resp.setContentType("application/x-msdownload");
		//設定下載時檔案的顯示型別(即檔名稱-字尾)   ex:txt為文字型別
		resp.setHeader("Content-Disposition","attachment;filename="+filename);
		
		//下載檔案:將一個路徑下的檔案資料轉到一個輸出流中,也就是把伺服器檔案通過流寫(複製)到瀏覽器端
		Files.copy(file.toPath(), resp.getOutputStream());//Files.copy(要下載的檔案路徑,響應的輸出流)
	}
}

點選下載專案資源   密碼:8wf2