原理:
Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
不多说:上码:
先新建一个jsp页面:一个form表单
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="file" label="请选择要上传的文件"></s:file>
<s:submit label="上传"></s:submit>
</s:form>
注意:method:必须是post,还有上传的编码必须是:multipart/form-data
然后再建一个action类:
private File file;//文件
private String fileFileName;//文件名称.名字不能变
private String fileContentType;//文件类型,名字不能变
注意:fileFileName:该文件名称不能变。fileContentType:文件类型的名称也不能变。这是因为struts2默认的对文件上传的注入。它在底层已经封装好了。我们可以直接用就行了。
最后当然是最重要的实现上传了。
@Override
public String execute() throws Exception {
String path=ServletActionContext.getServletContext().getRealPath(savePath);//存放的路径
String fileName=path+"\\"+user.getFileFileName();//文件名
BufferedInputStream bis=null;//文件输入流
BufferedOutputStream fis=null;//文件输出流
try {
//文件输入流
bis=new BufferedInputStream(new FileInputStream(user.getFile()));
//文件输出流
fis=new BufferedOutputStream(new FileOutputStream(fileName));
//新建一个数组存放文件数据
byte[] bt=new byte[1024];
int len=0;
//读取文件,判读文件是否还有数据
while((len=bis.read(bt))!=-1){
//写到bt数组里,从0开始,到len写入数据,是因为数组大小可能会超过文件大小
fis.write(bt,0,len);
}
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}finally{//关闭输入,输出流
try {
if(bis!=null)
bis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(fis!=null)
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return SUCCESS;
}
还有struts.xml文件
<action name="upload" class="com.accp.Action.UploadAction">
<param name="savePath">upload</param>
<result name="success">/uploadSuc.jsp</result>
<result name="input">/uploadFail.jsp</result>
<interceptor-ref name="defaultStack">
<!--配置单个文件最大字节 -->
<param name="fileUpload.maximumSize">102400</param>
<!-- 配置文件类型,注意文件类型不是.jpg.而是有一个类型名称。可以再tomact/conf/web.xml文件查找类型 -->
<param name="fileUpload.allowedTypes">image/pjpeg</param>
</interceptor-ref>
</action>
下载:(实现一个简单的下载)
一个jsp页面:<a href="download.action">下载</a>
一个action类:
public class Download extends ActionSupport{
public InputStream getDownloadFile(){
//返回一个输出流实例
return ServletActionContext.getServletContext().getResourceAsStream("/upload/123.jpg");
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
struts.xml文件:
<action name="download" class="com.accp.Action.Download">
<result name="success" type="stream">
<!-- 下载类型 -->
<param name="contentType">image/pjpeg</param>
<!-- 文件名,是因为http协议的关系所以要file="" -->
<param name="contentDisposition">filename="123.jpg"</param>
<!-- 输入流 ,downloadFile是getDownloadFile() 获取过来的 方法名。默认规定-->
<param name="inputName">downloadFile</param>
</result>
</action>
over.....