Struts2文件上传默认采用apache的文件上传的包,新建处理上传的Servlet 如下:
在WebRoot下面新建文件夹:upload,项目发布到服务器中去时服务器中就一个upload的文件夹
web.xml中Servlet配置如下:
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.mengya.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping>
新建JSP如下:
<form action="UploadServlet" method="post" enctype="multipart/form-data">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
file1:<input type="file" name="file1"><br>
file2:<input type="file" name="file2"><br>
<input type="submit" value="上传">
</form>
/**
*
* @author 张明学
*
* 使用apache的commons-io-1.3.2.jar,commons-fileupload-1.2.1.jar完成处理文件上传的Servlet
*/
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* request.getRealPath("/")返回的是当前项目所在硬盘的路径 如:C:\Program Files\Apache
* Software Foundation\Tomcat 6.0\webapps\Struts2_9\
* request.getRealPath("/upload")返回的是当前项目所在硬盘的路径+根目录下面的upload的路径
* 如:C:\Program Files\Apache Software Foundation\Tomcat
* 6.0\webapps\Struts2_9\Upload
*/
String path = request.getRealPath("/upload");
DiskFileItemFactory factory = new DiskFileItemFactory();
/**
* Apache上传组件上传的文件若小于某一值时就将要上面的文件放在内存中,否则就放到一个临时的目录中去。
*/
/**
* 设置文件小于多少时放到内存当中去。1024*1024为1M的大小
*/
factory.setSizeThreshold(1024 * 1024);
/**
* 设置大于上面设置的大小的文件上传时所放的临时目录,上传完成后临时目录所存放的垃圾文件不自动删除。
*/
factory.setRepository(new File(path));
/**
* ServletFileUpload完成上传的核内类
*/
ServletFileUpload servletUpload = new ServletFileUpload(factory);
try {
List<FileItem> list = servletUpload.parseRequest(request);
for (FileItem item : list) {
/**
* 非file字段,即普通的字段
*/
if (item.isFormField()) {
/**
* 获得字段的名称,即对应页面文本框等的名称
*/
String name = item.getFieldName();
/**
* 以gbk方式获得该字段的value值,即对应页面文本框等所输入的值
*/
String value = item.getString("gbk");
request.setAttribute(name, value);
} else {
/**
* file型字段
*/
/**
* 获得页面file的名称
*/
String name = item.getFieldName();
/**
* 获得页面file中用户选择的文件的路径(与普通的字段不同)
* 由于不同的浏览器所取得值不同,有的得到是所选择文件的路径,有的得到的就是所选择的文件的名称。
* 如:有的浏览器所取得的是:C:\Documents and
* Settings\Administrator\桌面\电话本.txt 有的浏览器所取得的是:电话本.txt
*/
String value = item.getName();
/**
* 下面做一个统一的处理 若为文件名则下面没有”\“则start为-1
*/
int start = value.lastIndexOf("\\");
String fileName = value.substring(start + 1);
request.setAttribute(name, fileName);
/**
* 下面做上传的处理
*/
InputStream is = item.getInputStream();
/**
* 上传的路径依然选择path
*/
File UploadFile = new File(path, fileName);
OutputStream os = new FileOutputStream(UploadFile);
byte[] buffer = new byte[400];
int length = 0;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, buffer.length);
}
os.close();
is.close();
/**
* 更简单的上传方式
* 无需使用InputStream和OutputStream对象item.write(File)即可
* item.write(UploadFile);
*/
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}