使用Struts1實現文件上傳(一)html
完成文件上傳功能大體須要如下幾個步驟: java
(1)建立用於文件上傳的JSP頁面;web
(2)建立用於承載數據的ActionForm;sql
(3)建立用於處理上傳的Action;數據庫
(4)配置文件上傳大小;apache
(5)配置從web.xml文件中讀取文件存放路徑;數組
步驟一:建立用於文件上傳的JSP頁面服務器
Java代碼oracle
[java] view plaincopyapp
<html:form enctype="multipart/form-data" action="/fileUpload" method="post">
<html:file property="uploadFile"></html:file>
<html:submit>Upload File</html:submit>
</html:form>
步驟二:建立用於承載數據的ActionForm
在項目中新建一個ActionForm的子類,如命名爲:FileUploadForm.java,在其中新增一個FormFile類型的屬性uploadFile,並設置getter、setter方法。
Java代碼
[java] view plaincopy
import org.apache.struts.upload.FormFile;
private FormFile uploadFile;
public FormFile getUploadFile() {
return uploadFile;
}
public void setUploadFile(FormFile uploadFile) {
this.uploadFile = uploadFile;
}
在Struts中,一個FormFile類型的對象對應Form表單中創送的一個文件,Struts將上傳的文件信息封裝金FormFile中,經過FormFile提供的方法能夠方便的進行文件的操做。其實FormFile是一個接口,位於 org.apache.struts.upload.FormFile 中,它定義了操做上傳文件的基本方法。
FormFile接口定義的經常使用方法:
(1) getFileName()/setFileName() //用於獲取或設置文件名;
(2) getFileSize() / setFileSize() //用於獲取或設置文件字節數;
(3) getFileData() //用於獲取文件的字節數組,用於小的文件;
(4) getInputStream() //用於獲取文件的輸入流,用於較大的文件;
(5) destory() //銷燬FromFile;
步驟三:建立用於處理上傳的Action
在項目中新建一個Action的子類,如命名爲:FileUploadAction.java,在其execute方法中添加處理代碼。
Java代碼
[java] view plaincopy
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
FileUploadForm fileUploadForm = (FileUploadForm) form;
FormFile uploadFile = fileUploadForm.getUploadFile();
try {
FileOutputStream outer = new FileOutputStream("d:\\"+uploadFile.getFileName());
byte[] buffer = uploadFile.getFileData();
outer.write(buffer);
outer.close();
uploadFile.destroy();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
在代碼中能夠看到,咱們從FileUploadForm中找到了FormFile類型的屬性,經過其提供的方法獲得文件的信息,並將其存入服務器的磁盤中。在保存的過程當中須要用到文件流的一些基本操做。
到此爲止,文件的上傳已經基本成功,剩下的兩步爲配置文件上傳大小和從web.xml文件中讀取文件存放路徑,能夠選擇學習。
步驟四:配置文件上傳大小
在Struts中能夠配置上傳文件的大小,以免服務器的硬盤消化不良。
打開項目中WebRoot\WEB-INF\struts-config.xml ,切換至源碼視圖,在其中添加以下節點信息,即可以控制上傳文件的大小了。
Xml代碼
[xml] view plaincopy
<controller maxFileSize="8K"></controller>
其中maxFileSize屬性的單位能夠是K,也能夠是M或G;Struts在寫 FormFile類時藉助的是fileupload中的API,設置的默認大小爲250M
注意:操做struts-config.xml文件時應當特別注意各個節點間的順序,由於Struts要求配置文件的各個元素順序有必定的要求,順序一旦被打亂,也就意味着web容器即將進入癱瘓狀態,所以在添加<controler>節點時,要將此節點添加在<action-mapping>和<message-resources>節點之間。
附:Struts-config.xml配置文件各元素的順序列表。
Xml代碼
[xml] view plaincopy
The content of element type "struts-config" must match "(display-name?,description?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)".
步驟五:配置從web.xml文件中讀取文件存放路徑
在步驟三中的代碼中咱們已經看到,在保存文件時,我寫的是一個固定的存放路徑,有沒有什麼辦法讓它動態改變呢?答案是確定的,Struts提供了一些方法能夠讀取web.xml中讀取數據,那麼咱們能夠把存放的路徑存放在web.xml文件中,存儲文件時再將路徑讀取出來。這樣作的好處是,若是存放路徑發生改變,咱們只須要修改配置文件,而不須要改動代碼。
打開項目WebRoot\WEB-INF\web.xml , 找到一個servlet,在該servlet的節點下添加以下代碼:
Xml代碼
[xml] view plaincopy
<init-param>
<param-name>path</param-name>
<param-value>d:\uploadFolder\</param-value>
</init-param>
要想讀取此節點的信息,在處理上傳文件的Action代碼中加入以下代碼:
Java代碼
[java] view plaincopy
//如下兩行代碼任選其一;
String path = this.getServlet().getInitParameter("uploadpath");
String path = this.getServlet().getServletConfig().getInitParameter("uploadpath")
到此基於Struts的文件上傳操做已經基本完成。
使用Struts1實現文件上傳(二)
在使用Struts1實現文件上傳(一)中,我將文件保存在服務器端的硬盤裏,有沒有辦法將其保存在Oracle10g數據庫中呢?答案是確定的,只須要對程序稍加改造就能夠實現將文件保存在數據庫中。用到時再將文件從數據庫中還原出來供用戶下載。
在數據庫中保存文件的方法和保存其餘基本數據類型相差很少,只是要存入便可,可是其對應的數據類型比較特殊,通常選擇二進制的數據類型。Oracle10g中提供了RAW和Long RAW數據類型,這兩中數據類型用於保存二進制的數據;二進制類型的好處在於當數據在不一樣系統之間傳輸時,能夠不作任何數據類型的轉換,方便了系統之間的操做。RAW類型的最大寬度爲2000字節,而Long RAW類型的最大寬度能夠達到2GB,很是適合保存圖像、聲音、視頻等數據量較大的數據。
所以,要想將文件保存在數據庫中用到時在取出來,就要完成三個步驟:
(1)新建Oracle10g數據表,在表中添加Long RAW類型的字段;
(2)在程序中將上傳的文件以流的形式保存到數據庫中;
(3)將文件從數據庫中還原出來。
1、新建Oracle10g數據表
在Oracle10g中新建一張數據表,如命名爲UploadFiles,在表中添加相應的字段;
Sql代碼
[sql] view plaincopy
create table UploadFiles
(
fileId number not null,
fileName varchar2(100) not null,
fileContent long raw not null,
filePubDate date not null
)
其中FileContent即是用來存放文件的Long RAW二進制數據類型。
2、將上傳文件保存在數據庫
剩下的工做即是在程序中編寫代碼將用戶上傳的文件保存在數據庫中了,主要的代碼已經在文章「使用Struts1實現文件上傳(一)」中實現,如今只須要將原來保存在文件中的部分代碼替換爲保存在數據庫的代碼便可。
Java代碼
[java] view plaincopy
UploadForm uploadForm = (UploadForm) form;
FormFile uploadFile = uploadForm.getUploadFile();
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:DataBaseName","username","password");
String sql = "insert into pic (fileName,fileContent,filePubDate) values (?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, uploadFile.getFileName());
ps.setBinaryStream(2, uploadFile.getInputStream(), uploadFile.getFileSize());
ps.setDate(3, new Date());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
當用戶點擊上傳後就能夠將文件存儲在數據庫中了。
3、將文件從數據庫中還原出來
當用戶須要用到文件時,就須要從數據中將文件查詢出來,方法也很簡單,看代碼:
Java代碼
[java] view plaincopy
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
<strong>InputStream input = null;</strong>
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:DataBaseName","username","password");
String sql = "select * from UpLoadFiles where id = 3";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
<strong>input = rs.getBinaryStream("pic");</strong>
}
//根據須要操做InputStream對象的代碼;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
將文件從數據庫中讀取出來後獲得的將是一個InputStream類型的對象,能夠根據須要操做這個對象還原文件。