1. 程式人生 > 其它 >JavaWeb檔案上傳與下載

JavaWeb檔案上傳與下載

<a href="file/DownloadServlet?fileId=QQ圖片3.jpg">QQ圖片3</a><br>

當超連結配置了file/路徑的時候,response.sendRedirect("tip.jsp")

會從file路徑下找tip.jsp這個檔案,因為沒有file這個路徑所以tip.jsp會找不到。解決的辦法是跳轉上一級目錄response.sendRedirect("../tip.jsp")

因為在web.xml<url-pattern>/file/DownloadServlet</url-pattern>

配置的第一條/斜線就代表根目錄,跳轉到根目錄就能找到

tip.jsp檔案了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

package com.xzit.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Date;
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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends
HttpServlet { private static final long serialVersionUID = 1L; private String uploadSaveDir; /** * 處理用檔案上傳請求的核心服務方法 * @param request 請求物件 * @param response 響應物件 */ protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ //上傳檔案儲存的目錄 uploadSaveDir = this.getServletContext().getRealPath("/WEB-INF/uploadFiles/"); System.out.println("檔案儲存的真實目錄"+uploadSaveDir); /* 建立預設屬性設定的磁碟檔案項工廠物件 */ DiskFileItemFactory factory = new DiskFileItemFactory(); System.out.println("預設檔案儲存的臨時目錄是 "+System.getProperty("java.io.tmpdir")); System.out.println(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); /* 構建ServletFileUpload元件 */ ServletFileUpload fileUpload = new ServletFileUpload(); //設定使用的FileItemFactory fileUpload.setFileItemFactory(factory); /* 設定相關屬性 */ fileUpload.setFileSizeMax(1024*1024*12); fileUpload.setSizeMax(1024*1024*12*10); fileUpload.setHeaderEncoding("utf-8"); /* 獲取FileItemFactory所有檔案項(FileItem) */ List<FileItem> itemList = null; try { itemList = fileUpload.parseRequest(request); for(FileItem item:itemList) {//遍歷List //判斷是普通表單欄位還是檔案元件 boolean bool = item.isFormField(); if(!bool) {//如果是檔案物件則儲存到磁碟 String fileName = item.getName(); //獲取上傳檔案的真實名稱 System.out.println("檔名稱:"+fileName); System.out.println("欄位名稱:"+item.getFieldName()); System.out.println("檔案的大小是:"+item.getSize()); System.out.println("檔案型別是 "+item.getContentType()); File target = new File(uploadSaveDir+new Date().getTime()+fileName); item.write(target); } item.delete();//釋放Item內容主體 } } catch (Exception e) { e.printStackTrace(); } } }
package com.xzit.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
    private String dir ;//下載檔案所在父目錄
    protected void service(HttpServletRequest request,HttpServletResponse response)
        throws ServletException,IOException{
        String id = request.getParameter("fileId");//獲取下載連結的檔案id引數
        dir = getServletContext().getRealPath("/WEB-INF/downloads/");
        
        //建立下載的目標檔案
        File target = new File(dir+id);
        InputStream input = null;
        ServletOutputStream output = null;
        if(target.exists()) {
            input = new FileInputStream(target);
            //設定檔案臨時儲存的緩衝區
            byte [] datas = new byte[10240];
            int count = 0;    //讀取位元組的計數器
            //設定響應頭內容,告知瀏覽器本次響應是檔案下載
            response.setHeader("content-disposition", 
                    "attachment;filename="+URLEncoder.encode(target.getName(),"UTF-8"));
            output = response.getOutputStream();//獲取響應給客戶端的檔案輸出流
            /* 讀取檔案到緩衝區,響應傳送輸出流到客戶端瀏覽器 */
            while((count = input.read(datas, 0, datas.length)) > 0) {
                output.write(datas, 0, count);//輸入到客戶端
            }
            output.flush();
            output.close();
            input.close();
        }else {//如果不存在
            response.sendRedirect("../tip.jsp");//定位到提示頁面
        }
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <h2>選擇檔案後點擊上傳按鈕上傳您的檔案</h2>
        <form action="file/FileUploadServlet" method="post" 
            enctype="multipart/form-data">
            檔案一:<input name="file1" type="file"><br>
            檔案二:<input name="file2" type="file"><br>
            年齡:<input name="age" type="text" value="23"><br>
            <input type="submit" value="上傳">
        </form>
    </body>
</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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>webFileUpload2</display-name>
  <welcome-file-list>
    <welcome-file>fileUpload.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <description></description>
      <display-name>FileUploadServlet</display-name>
      <servlet-name>FileUploadServlet</servlet-name>
      <servlet-class>com.xzit.servlet.FileUploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>FileUploadServlet</servlet-name>
      <url-pattern>/file/FileUploadServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
      <description></description>
      <display-name>DownloadServlet</display-name>
      <servlet-name>DownloadServlet</servlet-name>
      <servlet-class>com.xzit.servlet.DownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>DownloadServlet</servlet-name>
      <url-pattern>/file/DownloadServlet</url-pattern>
  </servlet-mapping>

</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <h2> 目標檔案不存在,無法下載,很抱歉</h2>
    </body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <%
        request.setCharacterEncoding("utf-8");
    %>
    <body>
        <h2>資源下載列表</h2>
        <a href="file/DownloadServlet?fileId=QQ圖片1.jpg">QQ圖片1</a><br>
        <a href="file/DownloadServlet?fileId=QQ圖片2.jpg">QQ圖片2</a><br>
        <a href="file/DownloadServlet?fileId=QQ圖片3.jpg">QQ圖片3</a><br>
    </body>
</html>