一、Servlet实现文件上传,需要添加第三方提供的jar包
下载地址:
1) commons-fileupload-1.2.2-bin.zip:
接着把这两个jar包放到 lib文件夹下:
编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded
比如:
三、举例:
1.fileupload.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 01 Transitional//EN">
<Meta http-equiv="pragma" content="no-cache">
<Meta http-equiv="cache-control" content="no-cache">
<Meta http-equiv="expires" content="0">
<Meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<Meta http-equiv="description" content="This is my page">
- @author Administrator
- 文件上传
- 具体步骤:
- 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
- 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
- 3)对 DiskFileItemFactory 对象设置一些 属性
- 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory);
- 目的是调用 parseRequest(request)方法 获得 FileItem 集合list ,
- 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理
- 6)
- 第一种 用第三方 提供的 itemwrite( new File(path,filename) ); 直接写到磁盘上
- 第二种 手动处理
-
*/
public class FileUpLoad extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
requestsetCharacterEncoding("utf-8"); //设置编码
//获得磁盘<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>条目工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>需要<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>到的路径
String path = requestgetRealPath("/upload");
//如果没以下两行设置的话,<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>大的 <a href="/tag/wenjian/" target="_blank" class="keywords">文件</a> 会占用 很多内存,
//设置暂时存放的 存储室,这个存储室,可以和 最终存储<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a> 的目录不同
/**
* 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,
* 按理来说 当<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>一个<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>时,其实是<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>了两份,第一个是以 tem 格式的
* 然后再将其真正写到 对应目录的硬盘上
*/
factorysetRepository(new File(path));
//设置 缓存的大小,当<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的容量超过该缓存时,直接放到 暂时存储室
factorysetSizeThreshold(1024*1024) ;
//高水平的API<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>处理
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//可以<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>多个<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>
List<FileItem> list = (List<FileItem>)uploadparseRequest(request);
for(FileItem item : list)
{
//<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>表单的<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>名字
String name = itemgetFieldName();
//如果<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>的 表单信息是普通的 文本 信息
if(itemisFormField())
{
//<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="/tag/yonghu/" target="_blank" class="keywords">用户</a>具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
String value = itemgetString() ;
requestsetAttribute(name,value);
}
//对传入的非 简单的字符串进行处理 ,比如说二进制的 <a href="/tag/tupian/" target="_blank" class="keywords">图片</a>,电影这些
else
{
/**
* 以下三步,主要<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a> <a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的名字
*/
//<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>路径名
String value = itemgetName() ;
//索引到最后一个反斜杠
int start = valuelastIndexOf("\\");
//<a href="/tag/jiequ/" target="_blank" class="keywords">截取</a> <a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的 字符串名字,加1是 去掉反斜杠,
String filename = valuesubstring(start+1);
requestsetAttribute(name,filename);
//真正写到磁盘上
//它抛出的异常 用exception 捕捉
//itemwrite( new File(path,filename) );//第三方提供的
//手动写的
OutputStream out = new FileOutputStream(new File(path,filename));
InputStream in = itemgetInputStream() ;
int length = 0 ;
byte [] buf = new byte[1024] ;
Systemoutprintln("<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的总共的容量:"+itemgetSize());
// inread(buf) 每次读到的数据存放在 buf 数组中
while( (length = inread(buf) ) != -1)
{
//在 buf 数组中 取出数据 写到 (<a href="/tag/shuchu/" target="_blank" class="keywords">输出</a>流)磁盘上
outwrite(buf,length);
}
inclose();
outclose();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
catch (Exception e) {
// TODO Auto-generated catch block
//eprintStackTrace();
}
requestgetRequestDispatcher("filedemojsp")forward(request,response);
}
}
3.filedemo.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 01 Transitional//EN">
<Meta http-equiv="pragma" content="no-cache">
<Meta http-equiv="cache-control" content="no-cache">
<Meta http-equiv="expires" content="0">
<Meta http-equiv="keywords" content="keyword1,keyword3">
<Meta http-equiv="description" content="This is my page">
用户名:${requestScopeusename }
文件:${requestScopefile1 }
${requestScopefile2 }
<img alt="go" src="upload/<%=(String)requestgetAttribute("file1")%> " />
4结果页面: