本教學示範如何透過 Struts 的 FormFile 將使用者上傳的圖片儲存至 MySQL 資料庫。流程涵蓋建表、JSP 頁面、ActionForm、Action 類別完整代碼。
CREATE TABLE test (
name VARCHAR(20),
pic BLOB
);
在 MySQL 的 test 資料庫中執行。
multi.jsp)關鍵點:enctype="multipart/form-data",否則提交會拋出異常。
<%@ page language="java" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-html" prefix="html" %>
<html>
<head><title>多檔案上傳表單</title></head>
<body>
<html:form action="/multi" enctype="multipart/form-data">
file : <html:file property="file"/>
<html:errors property="file"/><br>
name : <html:text property="name"/>
<html:errors property="name"/><br>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
MultiForm.java)package saoo.struts.form;
import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;
public class MultiForm extends ActionForm {
private FormFile file;
private String name;
public FormFile getFile() { return file; }
public void setFile(FormFile file) { this.file = file; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
MultiAction.java)核心邏輯:取得 FormFile,建立資料庫連線,使用 PreparedStatement 的 setBinaryStream 寫入 BLOB 欄位。
package saoo.struts.action;
import java.io.*;
import java.sql.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.FormFile;
import saoo.struts.form.MultiForm;
public class MultiAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
MultiForm multiForm = (MultiForm) form;
FormFile file = multiForm.getFile();
String name = multiForm.getName();
try {
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql:///test";
Connection con = DriverManager.getConnection(url, "root", "password");
String sql = "INSERT INTO test VALUES (?, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, name);
// 寫入圖片二進位流
ps.setBinaryStream(2, file.getInputStream(), file.getFileSize());
ps.executeUpdate();
ps.close();
con.close();
return mapping.findForward("success");
} catch (Exception e) {
e.printStackTrace();
return mapping.findForward("error");
}
}
}
enctype="multipart/form-data"org.apache.struts.upload.FormFile 接收檔案BLOBPreparedStatement.setBinaryStream(int parameterIndex, InputStream x, int length) 寫入二進位資料<action path="/multi"
type="saoo.struts.action.MultiAction"
name="multiForm"
input="/form/multi.jsp"
scope="request">
<forward name="success" path="/success.jsp"/>
<forward name="error" path="/error.jsp"/>
</action>