支援多檔案上傳、一般表單欄位、自動偵測檔名/路徑/Content-Type、可配置儲存目錄。
package com.brainysoftware.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import java.util.Dictionary;
import java.util.Hashtable;
import java.io.*;
import java.io.IOException;
public class FileUploadBean {
private String savePath, filepath, filename, contentType;
private Dictionary fields;
// Getter/Setter 略...
private void setFilename(String header) { /* 解析 Content-Disposition 取得檔名與路徑 */ }
private void setContentType(String header) { /* 解析 Content-Type 標頭 */ }
public void doUpload(HttpServletRequest request) throws IOException {
ServletInputStream in = request.getInputStream();
byte[] line = new byte[128];
int i = in.readLine(line, 0, 128);
if (i < 3) return;
int boundaryLength = i - 2;
String boundary = new String(line, 0, boundaryLength);
fields = new Hashtable();
while (i != -1) {
String newLine = new String(line, 0, i);
if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
if (newLine.indexOf("filename=\"") != -1) {
// 處理檔案欄位
setFilename(new String(line, 0, i-2));
if (filename == null) return;
i = in.readLine(line, 0, 128); // Content-Type
setContentType(new String(line, 0, i-2));
i = in.readLine(line, 0, 128); // 空行
i = in.readLine(line, 0, 128); // 檔案內容第一行
newLine = new String(line, 0, i);
PrintWriter pw = new PrintWriter(
new BufferedWriter(new FileWriter(
(savePath == null ? "" : savePath) + filename)));
while (i != -1 && !newLine.startsWith(boundary)) {
i = in.readLine(line, 0, 128);
if ((i == boundaryLength+2 || i == boundaryLength+4) &&
new String(line, 0, i).startsWith(boundary))
pw.print(newLine.substring(0, newLine.length()-2));
else
pw.print(newLine);
newLine = new String(line, 0, i);
}
pw.close();
} else {
// 處理一般表單欄位
int pos = newLine.indexOf("name=\"");
String fieldName = newLine.substring(pos+6, newLine.length()-3);
i = in.readLine(line, 0, 128); // 空行
i = in.readLine(line, 0, 128); // 值第一行
newLine = new String(line, 0, i);
StringBuffer fieldValue = new StringBuffer(128);
while (i != -1 && !newLine.startsWith(boundary)) {
i = in.readLine(line, 0, 128);
if ((i == boundaryLength+2 || i == boundaryLength+4) &&
new String(line, 0, i).startsWith(boundary))
fieldValue.append(newLine.substring(0, newLine.length()-2));
else
fieldValue.append(newLine);
newLine = new String(line, 0, i);
}
fields.put(fieldName, fieldValue.toString());
}
}
i = in.readLine(line, 0, 128);
}
}
}
<jsp:useBean id="upload" class="com.brainysoftware.web.FileUploadBean" scope="request" />
<% upload.setSavePath("/var/upload/"); upload.doUpload(request); %>
檔名:<%= upload.getFilename() %><br>
路徑:<%= upload.getFilepath() %><br>
類型:<%= upload.getContentType() %><br>
表單欄位 userName:<%= upload.getFieldValue("userName") %>