struts2中文件上传



1.上传

浏览器端:

1.method=post

2.<input type="file" name="xx">

3.encType="multipart/form-data";

服务器端:

commons-fileupload组件

1.DiskFileItemFactory

2.ServletFileUpload

3.FileItem

struts2中文件上传:

默认情况下struts2框架使用的就是commons-fileupload组件.

struts2它使用了一个interceptor帮助我们完成文件上传操作。

<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>

在action中怎样处理文件上传?

页面上组件:<input type="file" name=" upload">

在action中要有三个属性:

private File upload;

private String uploadContentType;

private String uploadFileName;

在execute方法中使用commons-io包下的FileUtils完成文件复制.

FileUtils.copyFile(upload, new File("d:/upload",uploadFileName));

------------------------------------------------------------------------

关于struts2中文件上传细节:

文件的大小、后缀名、文件类型的控制都是在FileUploadInterceptor拦截器中的acceptFile方法中进行控制,不符合控制的会返回错误信息。

1.关于控制文件上传大小

在default.properties文件中定义了文件上传大小

struts.multipart.maxSize=2097152 上传文件默认的总大小 2m



可以在Struts.xml的<action>标签配置来控制文件上传的大小

<interceptor-ref name="defaultStack">

<!-- 允许上传的文件的大小 -->

<param name=" fileUpload.maximumSize">1024000</param>

</interceptor-ref>

2. 关于控制文件上传的后缀名

可以在Struts.xml的<action>标签配置来控制文件上传的大小

<interceptor-ref name="defaultStack">

<!-- 允许上传的文件的后缀名 -->

<param name=" fileUpload.allowedExtensions">txt,mp3</param>

</interceptor-ref>

3. 关于控制文件上传的类型

注意:如果设置了文件上传的类型,那么控制上传文件的后缀名将不再起作用,因为allowedTypes的优先级高于allowedExtensions

可以在Struts.xml的<action>标签配置来控制文件上传的大小

<interceptor-ref name="defaultStack">

<!-- 允许上传的文件的后缀名 -->

<param name=" fileUpload.allowedTypes">text/plain</param>

</interceptor-ref>

4.在struts2中默认使用的是commons-fileupload进行文件上传。

# struts.multipart.parser=cos

# struts.multipart.parser=pell

struts.multipart.parser=jakarta

如果使用pell,cos进行文件上传,必须导入其jar包.

5.如果出现问题,需要配置input视图,在页面上可以通过 <s:filed2rror>展示错误信息.

问题:在页面上展示的信息,全是英文,要想展示中文,国际化

struts-messages.properties 文件里预定义 上传错误信息,通过覆盖对应key 显示中文信息

struts.messages.error.uploading=Error uploading: {0}

struts.messages.error.file.too.large=The file is to large to be uploaded: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}



修改为

struts.messages.error.uploading=上传错误: {0}

struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

{0}:<input type=“file” name=“uploadImage”>中name属性的值

{1}:上传文件的真实名称

{2}:上传文件保存到临时目录的名称

{3}:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)



6.关于多文件上传时的每个上传文件大小控制以及上传文件类型控制.

1.多文件上传

服务器端:

只需要将action属性声明成List集合或数组就可以。

private List<File> upload;

private List<String> uploadContentType;

private List<String> uploadFileName;



保存到电脑的代码:

for(int i = 0 ; i<upload.size();i++){

System.out.println("文件名称:"+uploadFileName.get(i));

System.out.println("文件类型:"+uploadContentType.get(i));

FileUtils.copyFile(upload.get(i),new File("c:/upload",uploadFileName.get(i)));

}



JSP: name都是upload,就是和action中File upload中对应即可

<form action="${pageContext.request.contextPath }/uploadFiles"

method="post" enctype="multipart/form-data">

<input type="file" name=" upload"><br>

<input type="file" name=" upload"><br>

<input type="file" name=" upload"><br>

<input type="submit" value="upload">

</form>





2.控制上传文件的总大小

在Struts.xml中设置常量struts.mulipart.maxSize

<!-- 允许上传的文件的总大小 -->

<constant name=" struts.multipart.maxSize" value="20971520"></constant>

3.怎样控制每一个上传文件的大小以及上传文件的类型?

在fileupload拦截器中,通过其属性进行控制.

maximumSize---每一个上传文件大小

allowedTypes--允许上传文件的mimeType类型.

allowedExtensions--允许上传文件的后缀名.

<interceptor-ref name="defaultStack">

<param name="fileUpload.allowedExtensions">txt,mp3,doc</param>

</interceptor-ref>