文件上传
文件上传的前提:
- 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>