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

Struts2 文件上传与下载

2017-07-08 17:48 330 查看

1.文件上传

1.1必要条件:

(1)表单的method必须是post

(2)表单enctype必须是mulipart/form-data

(3)提供input type=“file”类型上传输入域,在 struts2中文件上传是由 fileUpload 拦截器完成的

2.1单文件上传

Action:
public class singleUploadAction extends ActionSupport {
private String name;
private File photo;//文件名必须是file类型,名字对应着表单的上传输入域
private  String photoFileName;//固定写法:xxxFileName,文件名字
private String photoContentType; //固定写法,上传文件的MIME 类型
public String upload() throws IOException {
System.out.println(name);
System.out.println(photoContentType);
ServletContext servletContext = ServletActionContext.getServletContext();
//存到这里面
String diectory =servletContext.getRealPath("/file");
// servletContext.getClassLoader().getResourceAsStream();
//得到流
//构建目标文件,需要两个参数
//文件目录,文件的名字 ,把photo写进target
File target = new File(diectory,photoFileName);
//写入文件
//复制
FileUtils.copyFile(photo,target);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
}

struts.xml:

<package name="singleUpload" extends="struts-default">
<action name="upload" class="singleUploadAction的路径" method="upload">
<!--显示文件后缀-->
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedExtensions">.jpg,.png,</param>
</interceptor-ref>
<result name="success">success.jsp</result>
<result name="input">singleFileUpload.jsp</result>
</action>
</package>

jsp:
<%--文件上传--%>
<s:actionerror/>
<s:fielderror/>
//显示错误信息
<form action="${pageContext.request.contextPath}/upload.action" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name">
图片:<input type="file" name="photo">
<input type="submit" value="上传">
</form>
//最后输出的文件在out里面




2.2多文件上传:

Action:
public class UploadAction extends ActionSupport {
private String username;
private List<File> file1;
private List<String> file1FileName;
private List<String> file1ContentType;

public String getUsername() {
return username;
}

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

public List<File> getFile1() {
return file1;
}

public void setFile1(List<File> file1) {
this.file1 = file1;
}

public List<String> getFile1FileName() {
return file1FileName;
}

public void setFile1FileName(List<String> file1FileName) {
this.file1FileName = file1FileName;
}

public List<String> getFile1ContentType() {
return file1ContentType;
}

public void setFile1ContentType(List<String> file1ContentType) {
this.file1ContentType = file1ContentType;
}

public String upload() throws IOException {
ServletContext servletContext = ServletActionContext.getServletContext();
String path = servletContext.getRealPath("/file");
//构建目标文件,需要两个参数
//文件目录,文件的名字 ,把photo写进target
for (int i = 0; i < file1.size(); i++) {
File file=new File(path,file1FileName.get(i));
FileUtils.copyFile(file1.get(i),file);
}

return SUCCESS;
}
}

xml:
<package name="upload2" extends="struts-default">
<action name="upload2" class="UploadAction的路径" method="upload">
<result name="success">success.jsp</result>
<result name="input">Upload.jsp</result>
</action>
</package>

jsp:
<form action="${pageContext.request.contextPath}/upload2.action" enctype="multipart/form-data" method="post">
用户名:<input type="text" name="username"><br>
上传文件:<input type="file" name="file1"><br>
上传文件:<input type="file" name="file1"><br>
<input type="submit" value="提交">
</form>


2.3 文件下载

2.3.1书写规范:

inputStream / fileName

struts.xml中action result的type=“stream”两个参数:

inputName[输入流的属性名]

contentDisposition=attachment;filename=${fileName}[通知浏览器以下载形式打开]

Action:
public class DownloadAction extends ActionSupport {
//定义一个输入流,把你要下载的东西给这个inputstream,名字随意,in 不行
public InputStream inputStream;
private String fileName;
public String download() throws IOException {
//实现下载,就是给inputstream
String realPath = ServletActionContext.getServletContext().getRealPath("/五百年.jpg");
//获得文件file,来获得名字
fileName= FilenameUtils.getName(realPath);
fileName=filenameEncoding(FilenameUtils.getName(realPath),ServletActionContext.getRequest(),ServletActionContext.getResponse());

inputStream=new FileInputStream(realPath);
return SUCCESS;
}

public InputStream getInputStream() {
return inputStream;
}

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}
public String filenameEncoding(String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {
String agent = request.getHeader("User-Agent"); //获取浏览器的类型    System.out.println(agent);
if (agent.contains("Firefox")) {
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"    +base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else if(agent.contains("MSIE")) {
filename = URLEncoder.encode(filename, "utf-8");
} else if (agent.contains("Safari")){
filename = new String(filename.getBytes("UTF-8"),"ISO8859-1");
}else {
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}

xml:
<package name="download" extends="struts-default">
<action name="download" class="DownloadAction动作类的路径" method="download">
<result name="success" type="stream">
<!--指定动作类中输入流,属性名-->
<param name="inputName">inputStream</param>
<!--通知浏览器以下载IDE形式打开-->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!--ognl表达式来获取值-->
</result>
</action>
</package>

jsp:
<a href="${pageContext.request.contextPath}/download.action">
下载</a>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: