例子:上傳一張廬山的照片
表單:
<form action=" upload.do"method="post" enctype="multipart/form-data"> //上傳編碼方式
標題: <input type="text" name="title"><br>
文件: <input type="file" name="myfile"><br>
<input type="submit" value="提交" >
</form>
流程:
用戶通過表單發請求上傳文件,Tomcat創建request封裝請求
key = title; vaule = “lushan”
key = myfile; vaule = byte[]類型字節數組對象(在http協議體)
upload .do請求給struts
struts截取路徑/upload, 找到該請求對應的配置信息
<action path="/upload"
type=" com. bjsxt . struts .UploadTestAction"
name= "uploadForm"
scope= "request"
<forward name=" success"path="/upload_ success jsp"/>
</action>
<form- bean name="uploadForm" type=" com. bjsxt . struts .UploadActionForm"/>
創建表單bean對象並自動收集表單數據
收集數據中,一旦有enctype= “multipart/ form-data”, Tomcat先創建出一 個實現FormFile接口(commons -fileupload 架包中)對
象,然後從request中通過參數名爲myfile找到封裝文件的byte[]類型字節數組對象,將封裝文件的字節流封裝到實現FormFile接口的對象。
收集數據:到bean中拿到跟參數名相同的屬性,調用UploadActionForm 的setTitle(String title) \ setMyfile(FormFile myfile)方法將value的值設到bean下。
◆第一個bean:參數名title,參數值爲"lushan"
◆第二個bean: 參數名myfile, 參數值爲封裝文件字節流實現FormFile接口的對象
存放文件的表單bean存在request中, (請求結束就銷燬, 所以要將文件拿出來,放在服務器上)
調用 processActionCreate(request, response, mapping), 創建action對象
調用processActionPerform( request, response, action, form, mapping) ,執行對象的execute()方法,
執行uploadTestAction
1、造型獲得ActionForm
UploadActionForm uaf=(UploadActionForm)form;
2、取得實現了FormFile接C ]類且封裝了文件字節流的對象
FormFile myFile=uaf . getMyfile(); //實現formfile接[封裝文件的對象
3、拿到上傳的文件名,通過文件名,創建文字字節輸出流
Fileoutputstream fos=new Fileoutputstream("c:\\" myFile.getFileName); //創建文件字節輸出流
4、將字節數組對象的數據寫到文件對象輸出流所指的文件上
fos .write(myFile. getFileData()); //取得文件字節流對象
5、強行清空緩存,關閉流
fos . flush();
fos . close();
返回ActionForward 對象,struts 解析後在jsp 頁面顯示什麼文件上傳成功:
return mapping. f indForward("success"); .
upload_success.jsp 中
${ uploadForm. myfile .fileName}
◆通過屬性名uploadForm, 找到了封裝了上傳文件的表單Bean ActionForm
◆通過.myfile, 找到了表單Bean中的myfile屬性,該屬性中是實現了FormFile接口類的對象的地址
◆通過調用getFileName()方法,得到上傳文件的文件名
限定上傳文件大小
默認250M
<controller maxFileSize="10M"/>//限定最大上傳數據大小