如果您曾經使用 Visual Basic 開發過文件上傳組件,那麼轉向 Java 編寫 JSP 文件上傳 JavaBean 將會是一個相當順利的過程。本文提供一個精簡版的實作範例,展示如何從零開始構建一個功能完整的文件上傳處理類別。
yuanyifileup 類別封裝了文件上傳的核心邏輯,主要包含以下關鍵組件:
ServletConfig 與 PageContext 環境ServletInputStream 直接讀取原始 HTTP 請求資料public void initialize(ServletConfig config, HttpServletRequest request, HttpServletResponse response)
public void initialize(PageContext pageContext)
靈活的初始化設計使該 Bean 既可在 Servlet 中使用,也能直接在 JSP 頁面透過 pageContext 呼叫,提高了復用性。
setFilename(String s) 方法負責建立輸出檔案流,並內建異常處理機制,確保路徑有效性。
getByte() 方法將完整的請求內容讀入位元組陣列,為後續解析奠基。雖然此處採用逐位元組讀取(效率較低),但邏輯清晰易懂,適合教學用途。
核心方法 save() 實作了簡易的 multipart 解析:
image/ 內容型別標記\r\n\r\n 後的檔案實際內容;\r\n 前的資料注意:此解析邏輯假設上傳內容為圖片且結構固定,生產環境建議使用成熟庫(如 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/,不支援其他檔案類型現代開發建議:
@MultipartConfig 註解(Servlet 3.0+)原生支援這個簡版實作適合理解「文件上傳底層如何運作」,但實務專案請務必使用成熟框架。技術遷移的過程中,理解規格差異(VB 元件 vs JavaBean 生命週期)比語法轉換更重要。