筆記:JDBC文件上傳&下載

1、上傳下載實現原理java

  文件的上傳下載實現原理,如圖:瀏覽器

  上傳原理:緩存

      一、客戶端瀏覽器經過文件瀏覽框,選擇須要上傳的文件內容(其中包括文件路徑和文件內容)。安全

      二、客戶端瀏覽器經過上傳按鈕,將本地文件上傳到瀏覽器。服務器

      三、服務器經過程序接收本地文件內容,並將其保存在服務器的磁盤中。dom

  下載實現流程:異步

      一、客戶端瀏覽器經過點擊下載按鈕,將服務器保存的文件下載到本地磁盤。工具

      二、服務器端經過程序將服務器文件響應給客戶端。性能

2、文件的上傳:
  * 分析實現步驟:
    * 客戶端瀏覽器經過文件域選擇本地要上傳的文件.
    * 點擊"上傳"按鈕,將要上傳的文件發送到服務器端.
    * 服務器端接收客戶端發送的上傳文件.
    * 定義一個保存上傳文件的路徑.
    * 將上傳的文件保存在該路徑中.
    * 將上傳後的結果,響應給客戶端瀏覽器.
  * 客戶端:
    * 頁面元素:
      * 定義一個用於向服務器端發送請求的表單.
      * 表單內具備文件域用於選擇本地要上傳的文件.
      * 表單內具備submit按鈕用於提交請求的.
      * 問題:
      * 提交表單時,只是將文件域選擇的文件名稱上傳.(並非將上傳文件提交)
      * 爲表單設置enctype="multipart/form-data"
  * 注意:
    * 文件域必須指定name屬性值,不然須要上傳的文件數據是不會上傳至服務器端.
    * 完成文件上傳功能的表單的請求類型必須是POST方式.
    * 完成文件上傳功能的表單的enctype屬性值設置爲「multipart/form-data」,
    該值的做用是將須要上傳的文件數據添加到Http請求體中,並使用MIME協議對上傳的文件進行描述.
  * 服務器端:
    * 第三方工具:fileupload
    * 使用fileupload組件:
    * commons-fileupload-1.3.1.jar
    * commons-io-2.2.jar
    * 將該Jar包導入到Web工程中.

  * 注意的事情:
    * 將上傳文件保存的目錄放置在Web應用程序的根目錄下.(不安全)
  * 問題描述:
    * 將上傳文件保存後,能夠經過瀏覽器訪問到的.
  * 舉例:若是上傳的文件是一個JSP頁面,包含Java代碼(實現10秒自動關機).
  * 解決方案:
    * 將保存上傳文件的目錄,設置在一個不能經過瀏覽器訪問的位置.
    * 將保存上傳文件的目錄,放置在"WEB-INF"目錄下便可.
  * 處理上傳的文件名稱:
  * 問題描述:
    * 有些瀏覽器(IE 6),上傳的文件名稱並非單純的文件名,而是該文件的真實路徑.
  * 解決方案:
    * 判斷當前獲取的文件名稱是真實文件名,仍是上傳文件的真實路徑.
    * 若是是真實路徑,將文件名以前的全部路徑去掉.
    // 文件名多是絕對路徑,進行切割
    int index = fileName.lastIndexOf("\\");
    // 獲取"\"以後的內容(真正的文件名)
    if(index >= 0){
      fileName = fileName.substring(index + 1);
    }
  * 處理上傳文件的中文亂碼問題:
  * 問題描述:
    * 上傳文件的名稱存在中文亂碼問題.
    * 上傳表單中的普通字段值存在中文亂碼問題.
  * 解決方案:
  * 上傳文件名稱:
    * request.setCharacterEncoding("utf-8");
    * ServletFileUpload.setHeaderEncdoing(「UTF-8」);
  * 普通字段值:
    * FileItem.getString(編碼格式) - 編碼格式:表示當前文本內容爲何編碼.
  * 上傳文件名稱同名問題:
  * 問題描述:
    * 先後分別上傳兩個同名的文件,但內容不一樣.
    * 後上傳的文件會覆蓋前上傳的文件.
  * 解決方案:
    * 生成惟一ID:UUID.randomUUID().toString()+"_"+fileName;
  * 一個目錄不能存放多個文件:
  * 問題描述:
    * 若是一個目錄中存在上傳文件過多時,讀取不方便.
  * 解決方案:
    * 分紅多個目錄存儲上傳文件:
    * 按照日期分目錄:2015-03-3一、2015-04-01等
    * 按照MIME類型分目錄:文本格式、圖片、視頻等
    * 按照用戶ID分目錄:user一、user2等
  * 使用UUID生成隨機數的hashcode生成多級目錄:
    * 限制單個文件上傳大小:upload.setFileSizeMax(1024*1024*3);
    * 限制上傳文件的總大小:upload.setSizeMax(1024*1024*10);
    * 文件緩存大小與臨時目錄
    * 設置臨時目錄
    * 默認的臨時目錄爲System.getProperty("java.io.tmpdir").
      * DiskFileItemFactory.setRepository(new File(getServletContext().getRealPath(臨時目錄相對路徑)));
      * 在文件上傳完成後,調用FileItem的Delete()方法,刪除臨時目錄中的臨時文件.(釋放資源)
  * 設置緩存大小
      * 若是不手動設置緩存大小,默認爲10KB.
      * DiskFileItemFactory.setSizeThreshold(緩存字節數);
  * 手動將緩存大小設置10M,表示什麼意思?
      * 若是上傳文件小於10M的話,存在服務器端的內容中.
      * 若是上傳文件大於10M的話,存在服務器端的臨時目錄中.
  * 注意:若是設置緩存大小過大,影響服務器端的性能.
  * 計算文件上傳進度控制:
  * 計算上傳進度的相關信息:
    * 已用時間:當前時間 – 開始時間
    * 速度:已經上傳大小 / 已用時間
    * 剩餘大小:總大小 – 已經上傳大小
    * 剩餘時間:剩餘大小 / 速度
  * 如何實現監視上傳進度:
    * 使用ServletFileUpload提供的setProgressListener()方法實現.
  * 實現多文件上傳頁面:
  * 分類:
    * 一個表單包含多個文件域.
    * 同時選擇多個須要上傳的文件,一塊兒提交上傳.(問題:要麼一塊兒成功,要麼一塊兒失敗)
    * 一個文件域一個上傳,多個上傳文件之間是獨立的.(Ajax技術:異步交互)
    * 多文件上傳頁面實現動態.
  * 文件的下載:
  * 問題:
    * 提供的下載頁面,使用<a>連接指向要下載的資源文件.
    * 若是瀏覽器支持的格式,直接在瀏覽器中開發顯示.
    * 若是瀏覽器不支持的格式,提供下載的選項(提供下載).
    * 如今的下載需求:不管下載文件的格式,瀏覽器是否支持,都須要下載選項.
    * 必須經過服務器端的Servlet來完成文件下載功能.
  * 如何使用文件下載:
    * 建立一個文件下載頁面,當用戶點擊下載時,將請求提交服務器端的Servlet進行處理.
    * 服務器端的Servlet實現的步驟:
    * 獲取客戶端提交的下載文件名稱.
    * 獲取對應存儲下載文件的目錄結構.
    * 經過輸入流讀取對應下載文件內容.
    * 獲取Response對象的OutputStream輸出流.
    * 將讀取的輸入流,輸出到Response對象的輸出流,響應到客戶端瀏覽器下載便可.
  * 問題:
    * 設置當前下載文件的MIME類型.
    response.setContentType(getServletContext().getMimeType(filename));
    * 設置通知瀏覽器當前下載文件必須提供下載選項,而不是直接打開.
    response.setHeader("Content-Disposition", "attachment;filename="+filename);
  * 下載中文亂碼問題:
    * 解決GET方式請求下載文件名的中文亂碼:
      new String(filename.getBytes("ISO-8859-1"),"utf-8");
  * 下載對應文件時,下載文件名稱中文亂碼:
    String userAgent = request.getHeader("User-Agent");
    if(userAgent.contains("MSIE")){
    // 表示當前是IE瀏覽器
      filename = URLEncoder.encode(filename, "utf-8");
      filename = filename.replace("+", " ");
    }else{
      BASE64Encoder base64Encoder = new BASE64Encoder();
      filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
  }編碼

相關文章
相關標籤/搜索