一、场景
完成个人注册图片的上传,并在注册成功后,可以下载自己注册时上传的图片
二、实现
上传action
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import java.io.*;
import java.util.UUID;
public class FileAction extends ActionSupport {
private User user;
private File myUpload;//文件
private String myUploadFileName;//文件名
private String myUploadContentType;//文档类型
private String savePath;//存储路径
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public File getMyUpload() {
return myUpload;
}
public void setMyUpload(File myUpload) {
this.myUpload = myUpload;
}
public String getMyUploadFileName() {
return myUploadFileName;
}
public void setMyUploadFileName(String myUploadFileName) {
this.myUploadFileName = myUploadFileName;
}
public String getMyUploadContentType() {
return myUploadContentType;
}
public void setMyUploadContentType(String myUploadContentType) {
this.myUploadContentType = myUploadContentType;
}
//返回文件上传的保存位置
public String getSavePath() {
String str = ServletActionContext.getServletContext().getRealPath(savePath);
return str;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String upload() throws IOException {
String newName = UUID.randomUUID().toString();//新的方法名
String sufix = myUploadFileName.substring(myUploadFileName.lastIndexOf("."));//获取后缀名
newName+=sufix;//新文件名
//以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(getSavePath()+"\\"+newName);
System.out.println(getSavePath());
myUploadFileName = newName;
FileInputStream fileInputStream = new FileInputStream(getMyUpload());
System.out.println(fileOutputStream);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(bytes))>0){
fileOutputStream.write(bytes,0,len);
}
fileOutputStream.close();
return SUCCESS;
}
}
下载action
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileDowm extends ActionSupport {
private String name;
private String contentType;
public String getContentType() {
return ServletActionContext.getServletContext().getMimeType(name);
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public InputStream getFile1() throws FileNotFoundException {
return ServletActionContext.getServletContext().getResourceAsStream("/"+name);
}
@Override
public String execute() throws Exception {
System.out.println(name);
return SUCCESS;
}
}
struts2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="user7" extends="struts-default">
<action name="uplode" class="seven.FileAction" method="upload">
<param name="savePath">/</param>
<result name="success">/7/filedownload.jsp</result>
</action>
<action name="down" class="seven.FileDowm" method="execute">
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="contentDisposition">attachment;filename="${name}"</param>
<param name="inputName">file1</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
上传页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="uplode.action" method="post" enctype="multipart/form-data">
<h2>上传</h2>
用户名:<input type="text" name="user.name"/>
密码:<input type="password" name="user.pass"/>
上传:<<input type="file" name="myUpload">
<input type="submit" value="提交" />
</form>
</body>
</html>
下载页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>上传成功</title>
</head>
<body>
<s:property value="myUploadFileName" />
上传成功:<a href="down.action?name=<s:property value="myUploadFileName"/>">下载</a><br>
<img src="<s:property value="'/'+myUploadFileName" />">
</body>
</html>
三、问题与解决
①struts2.xml文件引入失败
<include file="five/fivestruts.xml"></include>
<include file="six/sixstruts.xml"></include>
<include file="seven/sevenstruts2.xml"></include>
解决:在设置model处添加(删除后统一添加所有xml)
②getRealPath报红线,方法找不到
ServletActionContext.getServletContext().getRealPath(savePath)
解决:去tomcat下找到servlet-api jar包引入到项目中;
③动态下载上传的内容xml配置
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="contentDisposition">attachment;filename="${name}"</param>
<param name="inputName">file1</param>
<param name="bufferSize">4096</param>
</result>
解决:使用ognl表达式动态化,需要action提供get方法!
如:file1
public InputStream getFile1() throws FileNotFoundException {
return ServletActionContext.getServletContext().getResourceAsStream("/"+name);
}
④超链接传参参数不正确
解决:name=xx 不加引号!,简单的问题困扰好久
<a href="down.action?name=<s:property value="myUploadFileName"/>" />
⑤idea在上传文件时建立文件夹发现tomacat/webapp下并没有自己部署的项目
解决:这是因为idea项目并没有部署到wenapp下,而是有自己的虚拟目录