Java運用于Web開發(fā)領(lǐng)域,常常需要實現(xiàn)文件的上傳和下載功能。通過Java的輸入輸出流,我們可以很方便的將文件上傳到服務(wù)器或者下載到本地。下面給大家介紹一下如何使用Java實現(xiàn)文件上傳和下載。
文件上傳 public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 檢查是否為文件上傳的請求 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { return; } // 配置上傳參數(shù) DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); try { // 解析上傳文件 Listitems = upload.parseRequest(request); for (FileItem item : items) { // 如果為普通表單字段,處理數(shù)據(jù) if (!item.isFormField()) { // 獲取文件名 String fileName = item.getName(); // 存儲目錄 File uploadDir = new File("/upload"); if (!uploadDir.exists()) { uploadDir.mkdir(); } // 存儲文件 File file = new File(uploadDir, fileName); item.write(file); } } } catch (Exception e) { e.printStackTrace(); } } }
上述代碼中,通過調(diào)用ServletFileUpload.isMultipartContent方法來判斷請求是否為文件上傳請求。若為文件上傳請求,使用DiskFileItemFactory和ServletFileUpload類來處理請求的數(shù)據(jù)。遍歷items列表檢查每個條目,如果不是表單字段,就將它存入指定路徑下的文件中。
文件下載 public class FileDownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲取文件名 String fileName = request.getParameter("fileName"); // 設(shè)定文件類型 response.setContentType("application/octet-stream"); // 文件下載 ServletOutputStream out = response.getOutputStream(); FileInputStream in = null; try { File file = new File("/upload", fileName); in = new FileInputStream(file); byte[] buffer = new byte[4096]; int length; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); } } }
上述代碼中,通過獲取參數(shù)fileName來獲取需要下載的文件名。設(shè)定文件類型為application/octet-stream,表示該文件是二進(jìn)制流文件。使用FileInputStream來讀取文件,使用ServletOutputStream來寫入文件。每次讀取的字節(jié)數(shù)為4096,每讀取一次就將數(shù)據(jù)寫入到response中。