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

struts2文件上传下载

2016-11-03 21:59 411 查看

文件上传

文件上传的前提:

a.表单method必须是post;

b.enctype取值必须是multipart/form-data;

c.提供文件选择域。

引入struts2的标签

<%@ taglib uri="/struts-tags" prefix="s" %>
<body>
<%--文件上传的必要前提:
1.请求方式必须是post
2.enctype属性的取值必须是multipart/form-data
3.提供一个文件选择域
--%>
<s:actionerror/>
<s:form action="upload.action" enctype="multipart/form-data">
<s:textfield name="username" label="用户名" />
<s:file name="photo" label="照片" />
<s:submit value="上传"/>
</s:form>
</body>


动作类:

//表单上提供的字段
private String username;
private File photo;
//struts2在文件上传时提供的属性
private String photoFileName;//上传的文件名。上传字段名称+FileName  注意大小写
private String photoContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写

public String upload(){
//1.拿到ServletContext
ServletContext application = ServletActionContext.getServletContext();
//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
String filePath = application.getRealPath("/WEB-INF/files");
//3.如果这个真实的目录不存在,需要创建
File file = new File(filePath);
if(!file.exists()){
file.mkdirs();
}
//4.把photo存过去
//拷贝:把photo的临时文件复制到指定的位置。注意:临时文件还在
//FileUtils.copyFile(photo, new File(file,photoFileName));

//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
photo.renameTo(new File(file,photoFileName));

return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}


文件上传的配置:

一,文件上传大小限制(默认是2MB)如果上传文件超过了默认大小,upload拦截器会转向一个input的逻辑视图。所有需要配置input视图:

<result name="input">/upload1.jsp</result>


修改文件上传大小的限制:

方法1:

<!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。
在default.properties中配的struts.multipart.maxSize=2097152-->
<constant name="struts.multipart.maxSize" value="5242880"></constant>


方式2:使用的拦截器是fileUploadInterceptor,所以可以向其中注入文件限制大小的方式:

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


二:限制文件上传的类型

1、通过限制上传文件的扩展名:给fileUpload拦截器注入参数

<param name="fileUpload.allowedExtensions">jpg,png,bmp</param>


2、通过限制上传文件的MIME类型

<param name="fileUpload.allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg</param>


注意:这里所有的上传的大小,以及类型如果超出了限制则会跳转到input视图,所有会出现如下的提示:



我们需要在出错后的错误信息中文提示(Struts2中的所有文本提示都是基于国际化的)默认信息提示在:struts2-core.jar\org.apache.struts2\struts-message.properties

解决办法:使用国际化消息资源包把对应的key取值改变一下



创建一个资源文件:fileuploadmessage.properties,放到src下面

然后配置如下:

<constant name="struts.custom.i18n.resources" value="com.itheima.web.action.fileupload_message"></constant>


多文件上传原理一样:

<body>
<%--文件上传的必要前提:
1.请求方式必须是post
2.enctype属性的取值必须是multipart/form-data
3.提供一个文件选择域
--%>
<s:actionerror/>
<s:form action="upload1.action" enctype="multipart/form-data">
<s:textfield name="username" label="用户名" />
<s:file name="photo" label="照片" />
<s:file name="photo" label="照片" />
<s:submit value="上传"/>
</s:form>
</body>


动作类:

public class UploadAction1 extends ActionSupport {

//表单上提供的字段
private String username;
private File[] photo;
//struts2在文件上传时提供的属性
private String[] photoFileName;//上传的文件名。上传字段名称+FileName  注意大小写
private String[] photoContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写

public String upload(){
//1.拿到ServletContext
ServletContext application = ServletActionContext.getServletContext();
//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
String filePath = application.getRealPath("/WEB-INF/files");
//3.如果这个真实的目录不存在,需要创建
File file = new File(filePath);
if(!file.exists()){
file.mkdirs();
}
//4.把photo存过去
//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
for(int i=0;i<photo.length;i++){
photo[i].renameTo(new File(file,photoFileName[i]));
}

return null;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public File[] getPhoto() {
return photo;
}

public void setPhoto(File[] photo) {
this.photo = photo;
}

public String[] getPhotoFileName() {
return photoFileName;
}

public void setPhotoFileName(String[] photoFileName) {
this.photoFileName = photoFileName;
}

public String[] getPhotoContentType() {
return photoContentType;
}

public void setPhotoContentType(String[] photoContentType) {
this.photoContentType = photoContentType;
}

}


配置文件:和单文件一样

文件下载:

动作类:

public class DownloadAction extends ActionSupport {
private InputStream inputStream;
private String filename;

public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String download() throws Exception{
String filePath = ServletActionContext.getServletContext().getRealPath("WEB-INF/files/5.jpg");
inputStream = new FileInputStream(filePath);
filename = "你好.jpg";
return SUCCESS;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
}


配置文件:

注意这里使用了ognl,而且使用了静态方法调用。所有需要声明:

<!-- 开启静态方法调用 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>


<action name="download" class="com.zeroyoung.web.action.DownloadAction" method="download">
<result name="success" type="stream">
<param name="contentType">application/octet-stream/</param>
<param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,"UTF-8")}</param>
<param name="inputName">inputStream</param>
</result>
</action>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0