Servlet3.0学习总结之基于Servlet3.0的文件上传实例
程序员文章站
2023-01-07 14:49:59
在servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如apache的commons-fileupload组件,在servlet3.0中提供了...
在servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如apache的commons-fileupload组件,在servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用servlet3.0提供的api就能够实现文件上传功能了。
一、使用servlet3.0提供的api实现文件上传
1.1、编写上传页面
<%@ page language="java" pageencoding="utf-8"%> <!doctype html> <html> <head> <title>servlet3.0实现文件上传</title> </head> <body> <fieldset> <legend> 上传单个文件 </legend> <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"--> <form action="${pagecontext.request.contextpath}/uploadservlet" method="post" enctype="multipart/form-data"> 上传文件: <input type="file" name="file"> <br> <input type="submit" value="上传"> </form> </fieldset> <hr /> <fieldset> <legend> 上传多个文件 </legend> <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"--> <form action="${pagecontext.request.contextpath}/uploadservlet" method="post" enctype="multipart/form-data"> 上传文件: <input type="file" name="file1"> <br> 上传文件: <input type="file" name="file2"> <br> <input type="submit" value="上传"> </form> </fieldset> </body> </html>
1.2、开发处理文件上传的servlet
1、使用注解@multipartconfig将一个servlet标识为支持文件上传。
2、servlet3.0将multipart/form-data的post请求封装成part,通过part对上传的文件进行操作。
uploadservlet 代码如下:
package me.gacl.web.controller; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.collection; import javax.servlet.servletexception; import javax.servlet.annotation.multipartconfig; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.part; //使用@webservlet配置uploadservlet的访问路径 @webservlet(name="uploadservlet",urlpatterns="/uploadservlet") //使用注解@multipartconfig将一个servlet标识为支持文件上传 @multipartconfig//标识servlet支持文件上传 public class uploadservlet extends httpservlet { public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { request.setcharacterencoding("utf-8"); response.setcharacterencoding("utf-8"); response.setcontenttype("text/html;charset=utf-8"); //存储路径 string savepath = request.getservletcontext().getrealpath("/web-inf/uploadfile"); //获取上传的文件集合 collection<part> parts = request.getparts(); //上传单个文件 if (parts.size()==1) { //servlet3.0将multipart/form-data的post请求封装成part,通过part对上传的文件进行操作。 //part part = parts[0];//从上传的文件集合中获取part对象 part part = request.getpart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取part对象 //servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来 //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip" string header = part.getheader("content-disposition"); //获取文件名 string filename = getfilename(header); //把文件写到指定路径 part.write(savepath+file.separator+filename); }else { //一次性上传多个文件 for (part part : parts) {//循环处理上传的文件 //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip" string header = part.getheader("content-disposition"); //获取文件名 string filename = getfilename(header); //把文件写到指定路径 part.write(savepath+file.separator+filename); } } printwriter out = response.getwriter(); out.println("上传成功"); out.flush(); out.close(); } /** * 根据请求头解析出文件名 * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip" * ie浏览器下:form-data; name="file"; filename="e:\snmp4j--api.zip" * @param header 请求头 * @return 文件名 */ public string getfilename(string header) { /** * string[] temparr1 = header.split(";");代码执行完之后,在不同的浏览器下,temparr1数组里面的内容稍有区别 * 火狐或者google浏览器下:temparr1={form-data,name="file",filename="snmp4j--api.zip"} * ie浏览器下:temparr1={form-data,name="file",filename="e:\snmp4j--api.zip"} */ string[] temparr1 = header.split(";"); /** *火狐或者google浏览器下:temparr2={filename,"snmp4j--api.zip"} *ie浏览器下:temparr2={filename,"e:\snmp4j--api.zip"} */ string[] temparr2 = temparr1[2].split("="); //获取文件名,兼容各种浏览器的写法 string filename = temparr2[1].substring(temparr2[1].lastindexof("\\")+1).replaceall("\"", ""); return filename; } public void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { this.doget(request, response); } }
运行结果如下:
可以看到,使用servlet3.0提供的api实现文件上传功能是非常方便的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。