struts 的文件上传

来源:互联网 发布:域名撤销备案 编辑:程序博客网 时间:2024/05/02 13:13
文件上传
      
    传统的文件上传
      (1)需要将form的enctype设置multipart/form-data
  此时会将整个表单以二进制的方式进行提交。
         接下来就无法通过request.getParameter来获取请求参数。
      (2)需要启用一个文件上传的组件(SmartUpload、Common-FileUpload)
      (3)Servlet通过文件上传组件来获取请求参数,获取上传的文件。
        得到上传的文件之后,以IO流的方式把文件写入磁盘即可。


    Servlet  3.0以后。
      只要增加一个@MultipartConfig修饰Servlet。
      接下来不可用request.getParameter()获取普通请求参数。
                  request.getPart()获取上传的文件。
     
     得到上传的文件之后,以IO流的方式把文件写入磁盘即可。
   
  Struts 2的更简单:
     
    每个文件上传域,需要在Action中提供3个Field进行封装。
      (1)1.与文件上传域的name同名的,类型为File的Filed. 


         //获得原始文件名用于,用于获取文件的类型        
         2.名为文件上传域的name  +  FileName,类型为String的Field.
       
 
             3.名为文件上传域的name  +  ContentType,类型为String的Field


        (2)接下来在返回结果的方法中,用File类型的文件进行,IO操作就行了,将文件写入
           服务器的物理磁盘即可。




      还有就是要记录我们的系统中有多少个文件,还有一个文件的上传时候的描述名picName,
      我们可以把这个上传的文件封装成一个文件对象,里面有一系列的属性,并且这里有一

      个属性保存文件上传路径。

这里需注意,需要设置一个常量的值来,设置上传文件的路径。

       <constant name="struts.multipart.saveDir" value="/upload"></constant>

这里还有用一个java.util.UUID类来给上传的文件另启名字。

1.上传文件的Action类

<span style="white-space:pre"></span>private String picName; //上传文件的名,用户输入的内容private File pic; // 上传文件的文件本身,也就是文件的上传的本地路径private String picFileName; //封装上传文件的真实文件名private String picContentType; //封装上传文件的文件类型public String execute() throws Exception {//由于此处pic就代表了我们的文件,因此此处只要IO流将文件写入磁盘即可。String uploadPath=ServletActionContext.getServletContext().getRealPath("/upload");String newFileName=UUID.randomUUID().toString()+picFileName.substring(picFileName.lastIndexOf("."));FileInputStream is=new FileInputStream(pic);FileOutputStream os=new FileOutputStream(uploadPath+File.separator+newFileName);System.out.println(uploadPath+File.separator+newFileName);byte[] buff=new byte[1024];int hasRead=0;while((hasRead=is.read(buff))>0){os.write(buff,0,hasRead);}is.close();os.close();PicService ps=new PicService();//调用业务逻辑组件的方法来管理系统中所有的图片ps.addPic(picName,newFileName);System.out.println(picName);System.out.println(newFileName);System.out.println(picName);return SUCCESS;}

2.封装picture对象,对图片进行管理。

public class Picture {private Integer id;private String picName;private String fileName;public Picture(){}public Picture(Integer id, String picName, String fileName) {super();this.id = id;this.picName = picName;this.fileName = fileName;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getPicName() {return picName;}public void setPicName(String picName) {this.picName = picName;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}}

 文件过滤的方式有两种:
    A.在Action通过代码进行控制。
      File类型的Field可以获取上传文件的大小。
    B.使用fileUpload拦截器进行过滤。
      只要进行简单的配置即可。
   allowedTypes:该参数指定允许上传的文件大小,单位是字节。

   maximumSize:该参数指定允许上传的文件大小,单位是字节。


<struts><!-- 更改文件上传错误提示 --><constant name="struts.custom.i18n.resources" value="mess"/>    <constant name="struts.devMode" value="true"/>    <constant name="struts.multipart.saveDir" value="/upload"></constant>        <package name="default" namespace="/" extends="struts-default">        <action name="FileUploadAction" class="pers.zkr.action.FileUploadAction">        <!--用拦截器控制文件上传的类型和大小  -->    <interceptor-ref name="fileUpload">    <param name="allowedType">image/png,image/pjpeg,image/jpg</param>    <param name="maximumSize">20000</param>    </interceptor-ref>        <!--用了其它的拦截器,需要配置默认的拦截器  -->    <interceptor-ref name="defaultStack"/>        <result type="chain">listPictures</result>    <!-- 指定文件上传失败跳转到的页面 -->    <result name="input">/WEB-INF/content/uploadForm.jsp</result>    </action>        <action name="listPictures" class="pers.zkr.action.listPicturesAction">    <result>/WEB-INF/content/listpictures.jsp</result>    </action>                <action name="*">    <result>/WEB-INF/content/{1}.jsp</result>        </action>        </package></struts>


   
   更改错误提示:
   要通过如下两个国际化消息的key:
     struts.messages.error.file.too.large=您要上传的文件太大,请重新选择!
     struts.messages.error.content.type.not.allowed=您上传的文件类型只能是图片
     文件!请重新选择!

      
0 0
原创粉丝点击