servlet文件上传下载_Servlet上传文件和下载文件示例
servlet文件上傳下載
Java Web應用程序中的文件上載和下載以及常見任務。 由于最近我寫了很多有關Java servlet的文章 ,因此我想提供一個使用servlet上傳和下載文件的示例示例。
用例
我們的用例是提供一個簡單HTML頁面,客戶端可以在其中選擇要上傳到服務器的本地文件。 在提交上傳文件的請求后,我們的Servlet程序會將文件上傳到服務器中的目錄中,然后提供URL,用戶可以通過該URL下載文件。 出于安全原因,不會為用戶提供下載文件的直接URL,而是會為他們提供下載文件的鏈接,并且我們的Servlet將處理請求并將文件發送給用戶。
我們將在Eclipse中創建一個動態Web項目,項目結構如下圖所示。
讓我們研究一下Web應用程序的所有組件并了解實現。
用于上傳文件HTML頁面
我們可以通過向Servlet發送發布請求并提交表單來將文件上傳到服務器。 我們無法使用GET方法上傳文件。 還要注意的一點是,表單的enctype應該是multipart / form-data 。 要從用戶文件系統中選擇文件,我們需要使用類型為file的 輸入元素。 因此,我們可以使用一個簡單HTML頁面將文件上傳為:
index.html
<html> <head></head> <body> <form action="UploadDownloadFileServlet" method="post" enctype="multipart/form-data"> Select File to Upload:<input type="file" name="fileName"> <br> <input type="submit" value="Upload"> </form> </body> </html>服務器文件位置
我們需要將文件存儲到服務器上的某個目錄中,我們可以在程序中對這個目錄進行硬編碼,但是為了獲得更好的靈活性,我們將在部署描述符上下文參數中將其保持可配置狀態。 另外,我們會將上傳文件的html頁面添加到歡迎文件列表中。
我們的web.xml文件如下所示:
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><display-name>ServletFileUploadDownloadExample</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><context-param><param-name>tempfile.dir</param-name><param-value>tmpfiles</param-value></context-param> </web-app>ServletContextListener實現
由于我們需要讀取文件位置的上下文參數并從中創建File對象,因此可以在初始化上下文時編寫ServletContextListener來執行此操作。 我們可以將絕對目錄位置和File對象設置為上下文屬性,以供其他servlet使用。
我們的ServletContextListener實現代碼如下。
FileLocationContextListener.java
package com.journaldev.servlet;import java.io.File;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener;@WebListener public class FileLocationContextListener implements ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {String rootPath = System.getProperty("catalina.home");ServletContext ctx = servletContextEvent.getServletContext();String relativePath = ctx.getInitParameter("tempfile.dir");File file = new File(rootPath + File.separator + relativePath);if(!file.exists()) file.mkdirs();System.out.println("File Directory created to be used for storing files");ctx.setAttribute("FILES_DIR_FILE", file);ctx.setAttribute("FILES_DIR", rootPath + File.separator + relativePath);}public void contextDestroyed(ServletContextEvent servletContextEvent) {//do cleanup if needed}}文件上傳下載Servlet實現
對于文件上傳,我們將使用Apache Commons FileUpload實用程序,對于我們的項目,我們使用版本1.3,FileUpload依賴于Apache Commons IO jar,因此我們需要將兩者都放置在項目的lib目錄中,如您在上面看到的那樣項目結構的圖像。
我們將使用DiskFileItemFactory工廠,該工廠提供一種方法來解析HttpServletRequest對象并返回FileItem的列表。 FileItem提供了有用的方法來獲取文件名,字段名,格式,大小和需要上載的文件的內容類型的詳細信息。 要將文件寫入目錄,我們要做的就是創建一個File對象,并將其作為參數傳遞給FileItem write()方法。
由于Servlet的全部目的是上傳文件,因此我們將重寫init()方法來初始化Servlet的DiskFileItemFactory對象實例。 我們將在doPost()方法實現中使用此對象將文件上傳到服務器目錄。
成功上傳文件后,我們將使用URL向客戶端發送響應以下載文件,因為HTML鏈接使用GET方法,因此我們將在URL中添加文件名參數,并且可以使用相同的servlet doGet()方法實施文件下載過程。
為了實現下載文件servlet,首先,我們將打開文件的InputStream并使用ServletContext.getMimeType()方法獲取文件的MIME類型并將其設置為響應內容類型。
我們還需要將響應內容的長度設置為文件的長度。 為了確保客戶理解我們正在發送文件作為響應,我們需要將“ Content-Disposition ”標頭設置為“ attachment”。 filename =“ fileName ”。
完成設置響應配置后,我們可以從InputStream讀取文件內容并將其寫入ServletOutputStream并將輸出刷新到客戶端。
我們的UploadDownloadFileServlet Servlet的最終實現如下所示。
UploadDownloadFileServlet.java
package com.journaldev.servlet;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Iterator; import java.util.List;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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;@WebServlet("/UploadDownloadFileServlet") public class UploadDownloadFileServlet extends HttpServlet {private static final long serialVersionUID = 1L;private ServletFileUpload uploader = null;@Overridepublic void init() throws ServletException{DiskFileItemFactory fileFactory = new DiskFileItemFactory();File filesDir = (File) getServletContext().getAttribute("FILES_DIR_FILE");fileFactory.setRepository(filesDir);this.uploader = new ServletFileUpload(fileFactory);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String fileName = request.getParameter("fileName");if(fileName == null || fileName.equals("")){throw new ServletException("File Name can't be null or empty");}File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileName);if(!file.exists()){throw new ServletException("File doesn't exists on server.");}System.out.println("File location on server::"+file.getAbsolutePath());ServletContext ctx = getServletContext();InputStream fis = new FileInputStream(file);String mimeType = ctx.getMimeType(file.getAbsolutePath());response.setContentType(mimeType != null? mimeType:"application/octet-stream");response.setContentLength((int) file.length());response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");ServletOutputStream os = response.getOutputStream();byte[] bufferData = new byte[1024];int read=0;while((read = fis.read(bufferData))!= -1){os.write(bufferData, 0, read);}os.flush();os.close();fis.close();System.out.println("File downloaded at client successfully");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {if(!ServletFileUpload.isMultipartContent(request)){throw new ServletException("Content type is not multipart/form-data");}response.setContentType("text/html");PrintWriter out = response.getWriter();out.write("<html><head></head><body>");try {List<FileItem> fileItemsList = uploader.parseRequest(request);Iterator<FileItem> fileItemsIterator = fileItemsList.iterator();while(fileItemsIterator.hasNext()){FileItem fileItem = fileItemsIterator.next();System.out.println("FieldName="+fileItem.getFieldName());System.out.println("FileName="+fileItem.getName());System.out.println("ContentType="+fileItem.getContentType());System.out.println("Size in bytes="+fileItem.getSize());File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileItem.getName());System.out.println("Absolute Path at server="+file.getAbsolutePath());fileItem.write(file);out.write("File "+fileItem.getName()+ " uploaded successfully.");out.write("<br>");out.write("<a href=\"UploadDownloadFileServlet?fileName="+fileItem.getName()+"\">Download "+fileItem.getName()+"</a>");}} catch (FileUploadException e) {out.write("Exception in uploading file.");} catch (Exception e) {out.write("Exception in uploading file.");}out.write("</body></html>");}}下圖顯示了該項目的示例執行。
您可以從以下網址下載Apache Commons IO jar和Apache Commons FileUpload jar。
- http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
- http://commons.apache.org/proper/commons-io/download_io.cgi
更新內容 :
- 下載ServletFileUploadDownloadExample項目
- 查閱有關Servlet異常處理系列的下一篇文章。
傳入的搜索條件:
- 文件下載servlet
翻譯自: https://www.javacodegeeks.com/2013/08/servlet-upload-file-and-download-file-example.html
servlet文件上傳下載
總結
以上是生活随笔為你收集整理的servlet文件上传下载_Servlet上传文件和下载文件示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 勇者斗恶龙安卓版一共几部(勇者斗恶龙安卓
- 下一篇: Linux条件判断(linux 条件判断