您的位置:首页 > 编程语言 > Java开发

struts 的文件上传

2015-10-13 16:23 357 查看
文件上传

      

    传统的文件上传

      (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=您上传的文件类型只能是图片

     文件!请重新选择!

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: