java struts文件上传和下载详解-mile米乐体育
java学习
2020年03月26日 23:25
0
struts2文件上传
struts 2框架提供了内置支持处理文件上传使用基于html表单的文件上传。上传一个文件时,它通常会被存储在一个临时目录中,他们应该由action类进行处理或移动到一个永久的目录,以确保数据不丢失。
请注意,服务器有一个安全策略可能会禁止写到目录以外的临时目录和属于web应用的目录。
在struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.interceptor.fileuploadinterceptor类的defaultstack中的一部分。仍然可以使用在struts.xml中设置各种参数,我们将在下面看到。
视图文件index.jsp
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% string path = request.getcontextpath(); string basepath = request.getscheme() "://" request.getservername() ":" request.getserverport() path "/"; %>my jsp 'index.jsp' starting page
在上面的例子中值得注意几点说明。首先,表单的enctype属性设置为multipart/ form-data。这应该是设置为使得处理文件上传文件上传。下一个点值得注意的是表单的 action方法上传和文件上传字段的名称 – myfile。我们需要这些信息创建操作方法和struts配置。
接下来让我们创建一个简单的 jsp 文件的success.jsp 结果显示我们的文件上传的情况下成功。
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%>文件上传 成功
创建action类: 处理上传文件
package com.oumyye.fileupload; import java.io.file; import java.io.ioexception; import org.apache.commons.io.fileutils; import com.opensymphony.xwork2.actionsupport; public class fileuploadaction extends actionsupport{ private file myfile; private string myfilecontenttype; private string myfilefilename; private string destpath; /** * */ private static final long serialversionuid = 1l; @override public string execute() throws exception { // todo auto-generated method stub destpath = "e:/upload/"; try{ system.out.println("src file name: " myfile); system.out.println("我的文件名" myfilefilename); system.out.println("我的文件类型" myfilecontenttype); file destfile = new file(destpath, myfilefilename); fileutils.copyfile(myfile, destfile); }catch(ioexception e){ e.printstacktrace(); return error; } return success; } public file getmyfile() { return myfile; } public void setmyfile(file myfile) { this.myfile = myfile; } public string getmyfilecontenttype() { return myfilecontenttype; } public void setmyfilecontenttype(string myfilecontenttype) { this.myfilecontenttype = myfilecontenttype; } public string getmyfilefilename() { return myfilefilename; } public void setmyfilefilename(string myfilefilename) { this.myfilefilename = myfilefilename; } public string getdestpath() { return destpath; } public void setdestpath(string destpath) { this.destpath = destpath; } public static long getserialversionuid() { return serialversionuid; } }
配置文件:
可以使用恒定的标签在应用程序 struts.xml文件,像我一样改变要上传的文件的最大大小。让我们有我们的在struts.xml如下:
/success.jsp /index.jsp text/plain attachment;filename="${filename}" downloadfile 1024
以下是web.xml文件中的内容,与struts2的基本配置一样
struts2_1000_fileupload struts2 org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter struts2 *.action
上述代码即可完成文件上传
文件下载
视图文件filedownload.jsp
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme() "://" request.getservername() ":" request.getserverport() path "/"; %>文件下载 文件下载内容:
dream.jpg:
创建action类: 处理上传文件,
package com.oumyye.action; import java.io.inputstream; import org.apache.struts2.servletactioncontext; import com.opensymphony.xwork2.actionsupport; //文件下载 public class filedownload extends actionsupport{ private string filename; public string getfilename() { return filename; } public void setfilename(string filename) { this.filename = filename; } //返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流 public inputstream getdownloadfile() throws exception { this.filename = "hello.jpg" ; //获取资源路径 return servletactioncontext.getservletcontext().getresourceasstream("upload/" this.filename) ; } @override public string execute() throws exception { return success; } }
配置文件同上
下载时可能会出现错误
can not find a java.io.inputstream with the name [downloadfile] in the invocation stack. check the tag specified for this action.
可能的原因:
1.文件路径不对,根本就没有取到文件。这种情况下,可以将获得inputstream的那条语句放在system.out.println()中输出一下,若为null,那就是路径不对了,或者说得准确些就根本没有找到文件。
2.在action中没有写配置文件中””后面属性的那个get方法.
展开全文