JavaWeb servlet實現下載與上傳功能的方法詳解
本文例項講述了JavaWeb servlet實現下載與上傳功能的方法。分享給大家供大家參考,具體如下:
本文內容:
- servlet實現下載功能
- servlet實現上傳功能
首發日期:2018-07-21
servlet實現下載功能
實現流程
1.首先製作一個jsp頁面,主要是用來觸發下載的。這裡可以根據你的想法來做,當然servlet那邊就要相應的更改了。我這裡使用一個簡單的a標籤來觸發。
2.設定響應資訊,告訴瀏覽器要將傳過來的資料識別成下載;根據提交上來的資料找到對應檔案,轉成流,返回給瀏覽器;
中文檔名問題:
- 雖然真的不建議使用中文檔名。但還是給一下處理手段。
先給出觸發的條件:
中文檔名需要解決兩個問題:
1.瀏覽器提交上來的中文檔名要識別:這裡是普通的get和post的中文資料問題
get方式:String filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); 【tomcat8不需要】
post方式:request.setCharacterEncoding("utf-8")
2.返回給瀏覽器時,瀏覽器能識別,即能正確顯示回來的下載檔名(如果你下載東西遇到過檔名亂碼,就是這個沒處理好):
處理方法:
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { // 1.獲取下載目標 String filename = request.getParameter("target"); System.out.println(filename); // 2.找到下載目標 String path = getServletContext().getRealPath("download/" + filename); File file = new File(path); if (file.exists()) { // 3.如果檔案存在,那麼設定響應的內容為下載,告訴瀏覽器將資訊識別成下載 // 判斷一下瀏覽器 String agent = request.getHeader("User-Agent"); if (agent.contains("Firefox")) {// 火狐 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else {// ie和谷歌 filename = URLEncoder.encode(filename,"utf-8"); } response.setHeader("Content-Disposition","attachment; filename=" + filename); // 4.獲取檔案流 FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream(); // 5.返回給瀏覽器 int len = 0; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) != -1) { os.write(buffer,len); } os.flush();// flush一下,確保一下 os.close(); fis.close(); } else { response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("找不到檔案"); } }
servlet實現上傳功能
1.建立一個頁面,用於上傳:【這裡只用了一個上傳,但事實上下面的程式碼是支援多個上傳的】
【當使用了enctype=
"multipart/form-data"之後,普通輸入框的內容,將無法使用getParameter獲取
】
2.匯入包,以便使用fileupload:commons-fileupload-1.2.1.jar和commons-io-1.4.jar【這裡匯入io包主要是用於io流對接,上傳的檔案流直接對接輸出流;如果你不匯入,那麼需要手動處理流中的資料!】
3.建立DiskFileItemFactory工廠類,用來:DiskFileItemFactory factory=new DiskFileItemFactory();
4.建立解析類,用於解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);
5.解析內容,獲取一個list,資料都儲存在list中:List<FileItem> list = upload.parseRequest(request);
現在資訊封裝方法已經跟之前沒有檔案上傳時不一樣了,所以需要解析:
6.操作list【list中的每一個元素都是FileItem物件,可以用FileItem物件.isFormField()來判斷是否是表單項(認為檔案是上傳項);如果是真的話,說明是普通的輸入框內容,如果你想要儲存輸入框提交的內容,那麼這裡可以處理一下;不為真說明是上傳項,這裡可以針對流進行操作】
如何操作?
對於普通表單項:item.getFieldName()可以獲取對應的name;item.getString()可以獲取對應的值
對於上傳項,需要操作它的流:item.getInputStream()可以獲取對應的資料流。
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8"); DiskFileItemFactory factory=new DiskFileItemFactory();//1.建立DiskFileItemFactory工廠類 ServletFileUpload upload=new ServletFileUpload(factory);//2.建立解析類,用於解析resquest try { List<FileItem> list = upload.parseRequest(request);//3.解析內容,獲取一個list,資料都儲存在list中 for(FileItem item:list) { if(item.isFormField()) {//判斷是否是普通的表單內容 System.out.println(item.getFieldName());//獲取的是表單中name屬性的值 System.out.println(item.getString());//獲取的是對應的表單的值 }else {//為假,說明是上傳項 //獲取流,進行處理 InputStream ism = item.getInputStream(); String path=getServletContext().getRealPath("/upload/"); System.out.println(path); String filename = item.getName();//這裡getName可以獲取檔名 System.out.println(filename); File file=new File(path+filename); file.createNewFile();//這裡不做檔案存在性和名字重複判斷 OutputStream fos = new FileOutputStream(file); //這裡直接藉助commons.io來做io對接,不然需要做流的讀取和寫入 IOUtils.copy(ism,fos);//把輸入流的資料拷貝到輸出流 IOUtils.closeQuietly(ism); IOUtils.closeQuietly(fos); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
更多關於java演算法相關內容感興趣的讀者可檢視本站專題:《Java檔案與目錄操作技巧彙總》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》和《Java快取操作技巧彙總》
希望本文所述對大家java程式設計有所幫助。