首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP 文件上傳組件開發實戰:從 VB 經驗遷移到 JavaBean

     編輯:關於JSP

前言:跨語言的技術遷移

如果您曾經使用 Visual Basic 開發過文件上傳組件,那麼轉向 Java 編寫 JSP 文件上傳 JavaBean 將會是一個相當順利的過程。本文提供一個精簡版的實作範例,展示如何從零開始構建一個功能完整的文件上傳處理類別。

核心類別架構解析

yuanyifileup 類別封裝了文件上傳的核心邏輯,主要包含以下關鍵組件:

  • 初始化機制:提供兩種初始化方式,分別支援 ServletConfig 與 PageContext 環境
  • 資料流處理:透過 ServletInputStream 直接讀取原始 HTTP 請求資料
  • 檔案儲存邏輯:解析 multipart/form-data 格式,提取檔案內容並寫入磁碟

關鍵方法詳解

雙重初始化策略

public void initialize(ServletConfig config, HttpServletRequest request, HttpServletResponse response)
public void initialize(PageContext pageContext)

靈活的初始化設計使該 Bean 既可在 Servlet 中使用,也能直接在 JSP 頁面透過 pageContext 呼叫,提高了復用性。

檔案路徑設定與驗證

setFilename(String s) 方法負責建立輸出檔案流,並內建異常處理機制,確保路徑有效性。

原始位元組讀取

getByte() 方法將完整的請求內容讀入位元組陣列,為後續解析奠基。雖然此處採用逐位元組讀取(效率較低),但邏輯清晰易懂,適合教學用途。

Multipart 解析與檔案提取

核心方法 save() 實作了簡易的 multipart 解析:

  1. 將位元組轉為 ISO-8859-1 字串
  2. 定位 image/ 內容型別標記
  3. 尋找雙重換行 \r\n\r\n 後的檔案實際內容
  4. 截取至邊界分隔符 ;\r\n 前的資料
  5. 寫入檔案並關閉流

注意:此解析邏輯假設上傳內容為圖片且結構固定,生產環境建議使用成熟庫(如 Apache Commons FileUpload)處理更複雜的邊界情況。

程式碼完整清單

package yuanyifileup;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.PageContext;

public class yuanyifileup {
    private ServletRequest request;
    private ServletResponse response;
    private ServletConfig config;
    ServletInputStream DATA;
    int FormSize;
    File f1;
    FileOutputStream os;
    DataInputStream is;
    String filename;
    byte[] b;
    byte t;
    boolean flag = false;

    public yuanyifileup() {}

    public void initialize(ServletConfig config, HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.request = request;
        this.response = response;
        this.config = config;
        DATA = request.getInputStream();
        FormSize = request.getContentLength();
    }

    public void initialize(PageContext pageContext) throws IOException {
        request = pageContext.getRequest();
        response = pageContext.getResponse();
        config = pageContext.getServletConfig();
        DATA = request.getInputStream();
        FormSize = request.getContentLength();
    }

    public boolean setFilename(String s) {
        try {
            File f1 = new File(s);
            os = new FileOutputStream(f1);
        } catch (IOException e) {
            return false;
        }
        return true;
    }

    public void getByte() {
        int i = 0;
        try {
            is = new DataInputStream(DATA);
            b = new byte[FormSize];
            while (true) {
                try {
                    t = is.readByte();
                    b[i] = t;
                    i++;
                } catch (EOFException e) {
                    break;
                }
            }
            is.close();
        } catch (IOException e) {}
    }

    public boolean save() {
        int i = 0, start1 = 0, start2 = 0;
        String temp = "";
        if (!flag) {
            getByte();
            flag = true;
        }
        try {
            temp = new String(b, "ISO8859_1");
        } catch (UnsupportedEncodingException e) {
            return false;
        }

        start1 = temp.indexOf("image/");
        temp = temp.substring(start1);
        start1 = temp.indexOf("\r\n\r\n");
        temp = temp.substring(start1 + 4);
        start2 = temp.indexOf(";\r\n");
        if (start2 != -1) {
            temp = temp.substring(0, start2);
        }
        try {
            byte[] img = temp.getBytes("ISO8859_1");
            for (i = 0; i < img.length; i++) {
                os.write(img[i]);
            }
            os.close();
        } catch (IOException e) {
            return false;
        }
        return true;
    }
}

技術債務與改進建議

此範例雖然展示了核心原理,但存在明顯局限:

  • 硬編碼尋找 image/,不支援其他檔案類型
  • 手動解析 multipart 邊界,容易因格式差異失效
  • 記憶體一次性載入整個請求,大檔案易導致 OOM
  • 缺乏檔案大小限制、類型驗證等安全機制

現代開發建議:

  1. 採用 @MultipartConfig 註解(Servlet 3.0+)原生支援
  2. 或整合 Apache Commons FileUpload / Servlet 3.1 標準 API
  3. 實作串流式處理,避免大檔案佔用堆記憶體
  4. 加入檔案類型白名單、大小上限、防毒掃描等防護

結語

這個簡版實作適合理解「文件上傳底層如何運作」,但實務專案請務必使用成熟框架。技術遷移的過程中,理解規格差異(VB 元件 vs JavaBean 生命週期)比語法轉換更重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved