javaweb文件上傳下載以及文件上傳成功後可是目錄中沒有顯示

通過看別人寫的代碼而後本身實際操做一遍,基本都是搬運也是爲了練習。
說明:
   對於文件上傳,瀏覽器在上傳的過程當中是將文件以流的形式提交到服務器端的,若是直接使用Servlet獲取上傳文件的輸入流而後再解析裏面的請求參 數是比較麻煩,因此通常選擇採用apache的開源工具common-fileupload這個文件上傳組件。這個common-fileupload上 傳組件的jar包能夠去apache官網上面下載,也能夠在struts的lib文件夾下面找到,struts上傳的功能就是基於這個實現的。 common-fileupload是依賴於common-io這個包的,因此還須要下載這個包。

1:建立fileUpLoad.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>實現文件上下傳</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">  
        用戶名: <input type="text" name="username" /><br>
        文件1: <input type="file" name="file1"><br>
        文件2: <input type="file" name="file2"><br>
        <input type="submit" value="上傳文件">
</form>
</body>
</html>
2:建立展現上傳狀態的頁面fileUploadResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>展現上傳下載結果</title>
</head>
<body>
 上傳狀態:${messages}<br>          
 用戶名 : ${requestScope.username} <br>
 文件1  : ${requestScope.file1 }<br>
 文件2 : ${requestScope.file2}<br>
</body>
</html>
3:建立servlet爲:UploadServlet.java
package package1;

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

import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
  
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//獲得上傳文件的保存目錄(爲了文件的安全首先將其目錄放在webroot目錄下)
		String path=this.getServletContext().getRealPath("/upload");
		File file=new File(path);
		//判斷上傳的文件保存目錄是否存在
		if(!file.exists() && !file.isDirectory()) {
			System.out.println(path + "目錄不存在,須要建立!");
			//建立目錄
			file.mkdir();
		}
		//消息顯示
		String message="";
		try {
			//使用Apache上傳文件,處理文件上傳步驟
			//1:建立一個DiskFileItemFactory工廠
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//2:建立一個文件上傳解析器
			ServletFileUpload upload=new ServletFileUpload(factory);
			//解決中文亂碼
			upload.setHeaderEncoding("UTF-8");
			//3:判斷提交的表單爲普通表單仍是帶文件上傳的表單
			if(!ServletFileUpload.isMultipartContent(request)) {
				//若是表單爲普通數據表單,則按照傳統的方式獲取數據
				return;
			}
			//4.使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個List<FileItem>集合,每個
                FileItem對應一個Form表單的輸入項
			List<FileItem> list=upload.parseRequest(request);
			for(FileItem item:list) {
				//若是fileItem中封裝的是普通輸入項的數據
				if(item.isFormField()) {
					//獲取字段名字
					String name=item.getFieldName();
					//解決普通輸入項中中文亂碼問題
					String value=item.getString("UTF-8");
					System.out.println(name + " = " + value);
				}else {
					//若是表單中提交的是上傳文件
					//得到上傳的文件名稱
					String filename=item.getName();
					System.out.println(filename);
					if(filename==null || filename.trim().equals("")) {
						continue;
					}
					/**
					 * 注意:不一樣的瀏覽器提交的文件名稱是不同的,有些瀏覽器提交的文件會帶有路徑,
					 * 如「D:\\project\WebRoot\hello.jsp」,有一些是單純的文件名:hello.jsp
					 */
					//去掉獲取到文件名中的路徑名,保留單純的文件名
					filename=filename.substring(filename.lastIndexOf("\\")+1);
					//獲取item中的上傳文件的輸入流
					InputStream in=item.getInputStream();
					//建立一個文件輸入流
					FileOutputStream out=new FileOutputStream(path+"\\"+filename);
					//建立一個緩衝區
					byte buffer[] =new byte[1024];
					//判斷輸入流中的數據讀取完畢
					int len = 0;
					//循環將輸入流讀入到緩衝區當中(len = in.read(buffer)>0)就表示in裏面還有數據存在
					while ((len=in.read(buffer))>0) {
					//使用FileOutputStream輸出流將緩衝區的數據寫入到指定的目錄(path+"\\"+filename)當中
						out.write(buffer, 0, len);
					}
					//關閉輸入流
					in.close();
					//關閉輸出流
					out.close();
					//刪除處理文件上傳時生成的的臨時文件
					item.delete();
					message="上傳成功";
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			message="文件上傳失敗";
			e.printStackTrace();
		}
		request.setAttribute("messages", message);
		request.getRequestDispatcher("/fileUploadResult.jsp").forward(request, response);
	}
}
4:配置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" id="WebApp_ID" version="3.0">
  <display-name>TestDemo3</display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>package1.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
5:啓動項目可能回出現:上傳成功可是在本身定義的文件加下找不到上傳的文件,能夠這樣修改下

 

6:下載功能:使用 response.getOutputStream(); 返回二進制數據流,實現文件下載
說明:
web項目大部分文件下載不須要寫代碼實現,只需經過超連接便可實現,就是經過超連接,在鏈接地址裏寫上文件的路徑,瀏覽器會自動打開該文件,若是是普通的文本,圖片等瀏覽器能直接顯示內容的瀏覽器都能直接打開並顯示,但若是是瀏覽器沒法打開的文件,好比rar,docx,exe等等,那麼瀏覽器就會提示你下載改文件或者使用當前系統自帶的工具打開該文件
代碼實現:
package package1;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

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;

@WebServlet("/doLoadServlet")
public class doLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 一、文件存放路徑
        String path="D:\\eclips\\workspace\\TestDemo3\\WebContent\\upload";
        // 二、須要下載的文件名
        String fileName="/ss10.jpg";
        File file = new File(path+fileName);
        response.reset();
        response.setCharacterEncoding("UTF-8");
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
        InputStream input = new FileInputStream(file);
        ServletOutputStream out = response.getOutputStream();
        byte[] buff =new byte[1024];
        int len ;
        while((len = input.read(buff)) != -1){
            out.write(buff, 0, len);
            out.flush();
        }
        input.close();
        out.close();
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

下載界面:doLoad.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="upload/ss10.jpg">文件下載</a>
</body>
</html>

配置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" id="WebApp_ID" version="3.0">
  <display-name>TestDemo3</display-name>
  <servlet>
    <servlet-name>doLoadServlet</servlet-name>
    <servlet-class>package1.doLoadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>doLoadServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

相關文章
相關標籤/搜索