天天看點

Java web 檔案上傳下載下傳(Eclipse + Tomcat)

1. firstly  我們需要準備好兩個包 分别為 commons-io-1.3.2.jar 以及   commons-fileupload-1.2.1.jar 

2. 我們要明确實施的方式 

Web頁面使用file标簽上傳一個檔案  以form标簽來包裝  再通過servlet的方式将form資料轉發到背景Servlet

背景Servlet通過request擷取到form的資料之後  找到真實檔案  指定伺服器端的一個路徑  然後将真實檔案以流的方式寫入到指定路徑下

掉轉到原上傳頁面将路徑以參數的形式傳遞到上傳頁面上

上傳頁面根據給定的路徑來加載相關的檔案

3.具體的代碼檔案

首先是jsp,index.jsp

注意這裡的<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>避免頁面中文亂碼

還有<%request.setCharacterEncoding("UTF-8");%>  保證request解析到的中文不會亂碼

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>" target="_blank" rel="external nofollow" >
    
    <title>My JSP 'index.jsp' starting page</title>
    <script type='text/javascript' src='/FileUploadDownLoad/jquery-2.1.1.js'></script>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css" target="_blank" rel="external nofollow" >
	-->
	
	
	
	<script type='text/javascript'>
		function download() {
			alert("down load the file");
			<%request.setCharacterEncoding("UTF-8");%>
			location.href = "<%=request.getScheme() +"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath() + "/"+request.getParameter("fileName")%>";
		} 
	 
	</script>
  </head>
  
  <body>
    <h>With this page, you can upload your file. </h>    
    <br>
    <form action="upload" method="post" enctype="multipart/form-data">
 	   username :  <input type="text" name="username"><br/>
	   <input type="file" name="myfile">
 	   <input type="submit" value="submit">
    </form>
   
    
    <input type="button" value="downLoad" onClick = "download();">
  </body>
</html>
           

第二部分web,xml  用來對servlet前背景互動的設定

<pre name="code" class="html"><?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>FileUploadDownLoad</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>UploadServlet</servlet-name>
  	<servlet-class>com.java.servlet.UploadHandleServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>UploadServlet</servlet-name>
      <url-pattern>/upload</url-pattern>
  </servlet-mapping>   
  
</web-app>
           

第三部分  Servlet類  UploadHandleServlet

package com.java.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * 
 * @author zero
 *
 */
public class UploadHandleServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
System.out.println("get the request from the page....");
		
		String path = req.getRealPath("/upload");//create a path to save the file uploaded
		
System.out.println(path);
		
		File file = new File(path);
		file.mkdirs();
		  
        DiskFileItemFactory factory = new DiskFileItemFactory();  
        factory.setRepository(file);   //set temporary file
  		factory.setSizeThreshold(1024*1024);//set temporary file's size
  		
  		ServletFileUpload upload = new ServletFileUpload(factory);
  		upload.setHeaderEncoding("UTF-8");//set the encoding language
  		
  		try {
  			List<FileItem> list = (List<FileItem>)upload.parseRequest(req);  //get the item list from the from label
  	
  			for(FileItem item : list) {
  				String name = item.getFieldName();   //get the file(field or real file)'s name
  				if(item.isFormField()) {
System.out.println("just a simple field....");
				String value = item.getString();
System.out.println(name + " = " + value );
  					req.setAttribute(name, value);
  				}else{
  					 String value = item.getName();//this item is real file
  					 
System.out.println("got a real file");  	

  					 int start = value.lastIndexOf("\\");
  					 String filename = value.substring(start+1);//獲得真正的檔案名字,通常這一步轉化隻有在使用Opera浏覽器時才需要使用
  					 
System.out.println("file name : " + filename);
  					
  					 req.setAttribute(name,  filename);
  					
  					 File f1 = new File(path,filename);
  					 
  					 OutputStream os = new FileOutputStream(f1);
  					 InputStream is = item.getInputStream();
  					 
  					 byte[] buffer = new byte[400];
  					 int length;
  					 
  					 while((length = is.read(buffer))!=-1) {
  						 os.write(buffer, 0, length);
  					 }
  					 
  					 is.close();
  					 os.close();
System.out.println("generate a file in the server.....");
  		  	  		req.getRequestDispatcher("index.jsp?&fileName=upload/" + filename).forward(req, resp);
  				}
  			}
  		}catch(Exception e) {
  			e.printStackTrace();
  		}
  		
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp){
		try {
			doGet(req, resp);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
           

幾個要點需要注意:

<form action="upload" method="post" enctype="multipart/form-data">來確定匿名上載檔案的正确編碼

upload.setHeaderEncoding("UTF-8");//set the encoding language保證Servlet端中文解碼的正确性

上傳的檔案會被儲存在D:\常用工具軟體\ApacheServer\apache-tomcat-8.0.8\webapps\FileUploadDownLoad\upload這個目錄下

前面的是安裝的tomcat所在的目錄  當然了也可以用MyEclipse内置的tomcat來運作項目,但是路徑會有差別

資源頁http://download.csdn.net/detail/lin19931006/8548537免費的哦

Java web 檔案上傳下載下傳(Eclipse + Tomcat)
Java web 檔案上傳下載下傳(Eclipse + Tomcat)