JavaWeb 后端 <十四> 文件上传下载
2016-04-01 20:41
405 查看
1.文件上传与下载
案例:注册表单/保存商品等相关模块!
--à注册选择头像/商品图片
(数据库:存储图片路径/图片保存到服务器中指定的目录)
1.1文件上传
文件上传,要点:
前台:1.提交方式:post
2.表单中有文件上传的表单项:<inputtype=”file”/>
3.指定表单类型:
默认类型:enctype="application/x-www-form-urlencoded"
文件上传类型:enctype=”multipart/form-data”
手动实现文件上传
<body> <formname="frm_test"action="${pageContext.request.contextPath}/upload"method="post"enctype="multipart/form-data"> 用户名:<inputtype="text"name="userName"><br/> 文件:<inputtype="file"name="file_img"><br/> <inputtype="submit"value="注册"> </form> </body>
publicclassUploadServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ /* request.getParameter("");//GET/POST request.getQueryString();//获取GET提交的数据 request.getInputStream();//获取post提交的数据*/ /***********手动获取文件上传表单数据************/ //1.获取表单数据流 InputStreamin=request.getInputStream(); //2.转换流 InputStreamReaderinStream=newInputStreamReader(in,"UTF-8"); //3.缓冲流 BufferedReaderreader=newBufferedReader(inStream); //输出数据 Stringstr=null; while((str=reader.readLine())!=null){ System.out.println(str); } //关闭 reader.close(); inStream.close(); in.close(); }
//输出结果: ------WebKitFormBoundaryGoQviatB7iM1dhPr Content-Disposition:form-data;name="userName"【FileItem】 Jack ------WebKitFormBoundaryGoQviatB7iM1dhPr Content-Disposition:form-data;name="file_img";filename="reamde.txt" Content-Type:text/plain【FileItem】 test!!!!!!!!!!!!! test!!!!!!!!!!!!! ------WebKitFormBoundaryGoQviatB7iM1dhPr--
Apache提供的文件上传组件:FileUpload组件
文件上传功能开发中比较常用,apache也提供了文件上传组件!FileUpload组件:
1.下载源码
2.项目中引入jar文件
commons-fileupload-1.2.1.jar【文件上传组件核心jar包】
commons-io-1.4.jar【封装了对文件处理的相关工具类】
FileItemFactoryfactory=newDiskFileItemFactory();
ServletFileUploadupload=newServletFileUpload(factory);
//upload目录,保存上传的资源
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
/*********文件上传组件:处理文件上传************/
try{
//1.文件上传工厂
FileItemFactoryfactory=newDiskFileItemFactory();//2.创建文件上传核心工具类
ServletFileUploadupload=newServletFileUpload(factory);
//一、设置单个文件允许的最大的大小:30M
upload.setFileSizeMax(30*1024*1024);
//二、设置文件上传表单允许的总大小:80M
upload.setSizeMax(80*1024*1024);
//三、设置上传表单文件名的编码
//相当于:request.setCharacterEncoding("UTF-8");
upload.setHeaderEncoding("UTF-8");
//3.判断:当前表单是否为文件上传表单
if(upload.isMultipartContent(request)){
//4.把请求数据转换为一个个FileItem对象,再用集合封装
List<FileItem>list=upload.parseRequest(request);
//遍历:得到每一个上传的数据
for(FileItemitem:list){
//判断:普通文本数据
if(item.isFormField()){
//普通文本数据
StringfieldName=item.getFieldName();//表单元素名称
Stringcontent=item.getString();//表单元素名称,对应的数据
//item.getString("UTF-8");指定编码
System.out.println(fieldName+""+content);
}
//上传文件(文件流)---->上传到upload目录下
else{
//普通文本数据
StringfieldName=item.getFieldName();//表单元素名称
Stringname=item.getName();//文件名
Stringcontent=item.getString();//表单元素名称,对应的数据
Stringtype=item.getContentType();//文件类型
InputStreamin=item.getInputStream();//上传文件流
/*
*四、文件名重名
*对于不同用户readme.txt文件,不希望覆盖!
*后台处理:给用户添加一个唯一标记!
*/
//a.随机生成一个唯一标记
Stringid=UUID.randomUUID().toString();
//b.与文件名拼接
name=id+"#"+name;
//获取上传基路径
Stringpath=getServletContext().getRealPath("/upload");
//创建目标文件
Filefile=newFile(path,name);
//工具类,文件上传
item.write(file);
item.delete();//删除系统产生的临时文件
System.out.println();
}
}
}
else{
System.out.println("当前表单不是文件上传表单,处理失败!");
}
}catch(Exceptione){
e.printStackTrace();
}
}
文件上传与下载,完整案例:
步骤:1.文件上传
2.列表下载
Index.jsp:
<body>
<ahref="${pageContext.request.contextPath}/upload.jsp">文件上传</a>
<ahref="${pageContext.request.contextPath}/fileServlet?method=downList">文件下载</a>
</body>
Upload.jsp:
<body>
<formname="frm_test"action="${pageContext.request.contextPath}/fileServlet?method=upload"method="post"enctype="multipart/form-data">
<%--<inputtype="hidden"name="method"value="upload">--%>
用户名:<inputtype="text"name="userName"><br/>
文件:<inputtype="file"name="file_img"><br/>
<inputtype="submit"value="提交">
</form>
</body>
Downlist.jsp:
<body>
<tableborder="1"align="center">
<tr>
<th>序号</th>
<th>文件名</th>
<th>操作</th>
</tr>
<c:forEachvar="en"items="${requestScope.fileNames}"varStatus="vs">
<tr>
<td>${vs.count}</td>
<td>${en.value}</td>
<td>
<%--<ahref="${pageContext.request.contextPath}/fileServlet?method=down&..">下载</a>--%>
<!--构建一个地址-->
<c:urlvar="url"value="fileServlet">
<c:paramname="method"value="down"></c:param>
<c:paramname="fileName"value="${en.key}"></c:param>
</c:url>
<!--使用上面地址-->
<ahref="${url}">下载</a>
</td>
</tr>
</c:forEach>
</table>
</body>
FileServlet.java
/**
*处理文件上传与下载
*@authorJie.Yuan
*
*/
publicclassFileServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取请求参数:区分不同的操作类型
Stringmethod=request.getParameter("method");
if("upload".equals(method)){
//上传
upload(request,response);
}
elseif("downList".equals(method)){
//进入下载列表
downList(request,response);
}
elseif("down".equals(method)){
//下载
down(request,response);
}
}
/**
*1.上传
*/
privatevoidupload(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
try{
//1.创建工厂对象
FileItemFactoryfactory=newDiskFileItemFactory();//2.文件上传核心工具类
ServletFileUploadupload=newServletFileUpload(factory);
//设置大小限制参数
upload.setFileSizeMax(10*1024*1024);//单个文件大小限制
upload.setSizeMax(50*1024*1024);//总文件大小限制
upload.setHeaderEncoding("UTF-8");//对中文文件编码处理
//判断
if(upload.isMultipartContent(request)){
//3.把请求数据转换为list集合
List<FileItem>list=upload.parseRequest(request);
//遍历
for(FileItemitem:list){
//判断:普通文本数据
if(item.isFormField()){
//获取名称
Stringname=item.getFieldName();
//获取值
Stringvalue=item.getString();
System.out.println(value);
}
//文件表单项
else{
/********文件上传***********/
//a.获取文件名称
Stringname=item.getName();
//----处理上传文件名重名问题----
//a1.先得到唯一标记
Stringid=UUID.randomUUID().toString();
//a2.拼接文件名
name=id+"#"+name;
//b.得到上传目录
StringbasePath=getServletContext().getRealPath("/upload");
//c.创建要上传的文件对象
Filefile=newFile(basePath,name);
//d.上传
item.write(file);
item.delete();//删除组件运行时产生的临时文件
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*2.进入下载列表
*/
privatevoiddownList(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示
//1.初始化map集合Map<包含唯一标记的文件名,简短文件名>;
Map<String,String>fileNames=newHashMap<String,String>();
//2.获取上传目录,及其下所有的文件的文件名
StringbathPath=getServletContext().getRealPath("/upload");
//目录
Filefile=newFile(bathPath);
//目录下,所有文件名
Stringlist[]=file.list();
//遍历,封装
if(list!=null&&list.length>0){
for(inti=0;i<list.length;i++){
//全名
StringfileName=list[i];
//短名
StringshortName=fileName.substring(fileName.lastIndexOf("#")+1);
//封装
fileNames.put(fileName,shortName);
}
}
//3.保存到request域
request.setAttribute("fileNames",fileNames);
//4.转发
request.getRequestDispatcher("/downlist.jsp").forward(request,response);
}
/**
*3.处理下载
*/
privatevoiddown(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取用户下载的文件名称(url地址后追加数据,get)
StringfileName=request.getParameter("fileName");
fileName=newString(fileName.getBytes("ISO8859-1"),"UTF-8");
//先获取上传目录路径
StringbasePath=getServletContext().getRealPath("/upload");
//获取一个文件流
InputStreamin=newFileInputStream(newFile(basePath,fileName));
//如果文件名是中文,需要进行url编码
fileName=URLEncoder.encode(fileName,"UTF-8");
//设置下载的响应头
response.setHeader("content-disposition","attachment;fileName="+fileName);
//获取response字节流
OutputStreamout=response.getOutputStream();
byte[]b=newbyte[1024];
intlen=-1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
//关闭
out.close();
in.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doGet(request,response);
}
}
相关文章推荐
- Java IO流基本操作
- java异常处理的学习笔记
- 【深入spring】IoC容器的实现
- java之文件
- 回归基础系列-快速排序[JAVA]
- 回归基础系列-选择排序[JAVA]
- java中getResourceAsStream(String path)与getClassLoader.getResourceAsStream(String path)
- 回归基础系列-插入排序[JAVA]
- 回归基础系列-冒泡排序-[JAVA]
- JavaEE_4_1_jsp的四个内置对象作用域
- Java使用SSLSocket通信
- MyBatis中配置Spring的事物
- 在eclipse中如何产看源码
- Java泛型入门
- Spring中属性文件properties的读取与使用
- Java 构造器之访问子类对象的实例变量
- Spring 如何读取properties文件内容
- MyEclipse、eclipse代码自动补全(联想输入)
- Java jacob调用打印机打印word文档
- Java-二进制