例子:上传一张庐山的照片
表单:
<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"/>//限定最大上传数据大小