• 文件的上传与下载案例


    要求:

      提供文件上传,上传大小有要求

      有页面显示已上传列表

      可以在上传列表中去下载文件


    首先是jsp页面,一个是主页面,是否,有两个选择——上传和下载列表

    代码如下:(index.jsp)

     <body>
        <a href="${pageContext.request.contextPath }/demo/upload.jsp">文件上传</a>  
        <a href="${pageContext.request.contextPath }/fileServlet?method=downList">文件下载</a>
      </body>
    

    然后是文件上传的页面

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>upload.jsp</title>
      </head>
      <body>
       <center>
       	 <form action="${pageContext.request.contextPath }/fileServlet?method=upload" method="post" enctype="multipart/form-data">
       	 用户名:<input type="text" name="userName"/>
       	 文件 :<input type="file" name="file_img"/>
       	 <input type="submit" value="提交"/>
        </form>
       </center>
      </body>
    </html>
    

    接着是文件的servlet处理(在服务器端我创建了一个文件夹(upload)用于存放上传文件)

    package com.gqx.demoServlet;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    public class fileServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//获取请求参数,区分是什么方法
    		String method=request.getParameter("method");
    		if ("upload".equals(method)) {
    			//上传
    			try {
    				upload(request,response);
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    		
    		if ("downList".equals(method)) {
    			//下载
    			downList(request,response);
    		}
    		
    		if ("down".equals(method)) {
    			try {
    				down(request,response);
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	
    	
    	}
    	
    	
    
    
    
    	private void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		// TODO Auto-generated method stub
    		//1、创建工厂类对象
    		DiskFileItemFactory factory=new DiskFileItemFactory();
    		//2、创建文件核心下载类
    		ServletFileUpload upload=new ServletFileUpload(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 (FileItem fileItem : list) {
    				//判断是否为普通文本数据
    				if (fileItem.isFormField()) {
    					//普通文本数据
    					String name=fileItem.getFieldName();
    					String value=fileItem.getString();
    					System.out.println(name+":"+value);
    				}else {
    					//文件上传
    					//获取文件名称
    					String name=fileItem.getName();
    					/***处理上传文件重命名问题**/
    					//a、先得到唯一的标记
    					String id=UUID.randomUUID().toString();		//生成一组唯一的字符串
    					//b、拼接文件名
    					name=id+"#"+name;
    					
    					//得到文件上传目录
    					String basePath=getServletContext().getRealPath("/upload");
    					//创建文件的上传对象
    					File file =new File(basePath,name);
    					//开始上传
    					fileItem.write(file);
    					//删除组件运行的时候产生的临时文件 
    					fileItem.delete();
    				}
    			}
    		}
    		response.sendRedirect(request.getServletContext().getContextPath()+"/demo/index.jsp");
    		
    	}
    
    	
    	private void downList(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		/**实现思路:先获取upload目录下的所有文件的文件名,在保存,跳转到down.jsp列表展示*/
    		//1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;
    		Map<String,String> fileMap=new HashMap<String, String>();
    		//2、获取上传目录,及其所有文件的文件名
    		String basePath=getServletContext().getRealPath("/upload");
    		//目录
    		File file=new File(basePath);
    		//目录下所有文件名
    		String list[]=file.list();
    		//遍历
    		if (list!=null && list.length > 0) {
    			//解析服务器下的文件名
    			for (int i=0;i<list.length;i++) {
    				//全名
    				String fileName=list[i];
    				//短名
    				String shortName=fileName.substring(fileName.indexOf("#")+1);
    				//封装
    				fileMap.put(fileName, shortName);
    			}
    		}
    		
    		//3、保存到request域fileNamess
    		request.setAttribute("fileNames", fileMap);
    		request.getRequestDispatcher("/demo/downList.jsp").forward(request, response);
    	}
    	
    	
    	/**
    	 * 处理文件下载
    	 * @param request
    	 * @param response
    	 */
    	private void down(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		// TODO Auto-generated method stub
    		//获取用户下载的文件名(url后面追加的,get请求)
    		String fileName=request.getParameter("fileName");
    		fileName=new String(fileName.getBytes("iso-8859-1"),"utf-8");
    		
    		//先获取上传目录路径
    		String basePath=getServletContext().getRealPath("/upload");
    		//获取一个文件流
    		InputStream in=new FileInputStream(new File(basePath,fileName));
    		
    		//如果文件名是中文,要进行url编码
    		fileName =URLEncoder.encode(fileName,"UTF-8");
    		
    		
    		// 设置下载的响应头
    				response.setHeader("content-disposition", "attachment;fileName=" + fileName);
    		//获取response字节流
    		OutputStream out=response.getOutputStream();
    		byte[] bytes=new byte[1024];
    		int len=-1;
    		while((len=in.read(bytes))!=-1){
    			out.write(bytes,0,len);
    		}
    		out.close();
    		in.close();
    	}
    
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

    有了它,就可以得到文件的列表及下载页面

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>  
        <title>My JSP 'downList.jsp' starting page</title>
      </head>
      
      <body>
       	<table border="1" align="center">
       		<tr>
       			<th>序号</th>
       			<th>文件名</th>
       			<th>操作</th>
       		</tr>
       		<c:forEach items="${requestScope.fileNames }" var="en" varStatus="vs">
       			<tr>
       				<td>${vs.count }</td>
    				<td>${en.value }</td>
       				<td>
       					<!-- 
       						<a href="${pageContext.request.contextPath}/fileServlet/method=down&.....">文件下载</a>
       						这样写太麻烦了
       					-->
       					<!-- 可以构建一个地址,如下 -->
       					
       					<c:url var="url" value="fileServlet">	<!-- 默认是当前的目录,如果要改到其他的项目,就写context="/another" -->
       						<c:param name="method" value="down"></c:param>
       						<c:param name="fileName" value="${en.key }"></c:param>
       					</c:url>
       					<!-- 使用上面的地址 -->
       					<a href="${url }">下载</a>
       				</td>
       			</tr>
       		</c:forEach>
       	</table>
      </body>
    </html>
    

    效果如图

    上传的列表与下载的文件

  • 相关阅读:
    61. Rotate List
    60. Permutation Sequence
    59. Spiral Matrix II ***
    58. Length of Last Word
    57. Insert Interval
    328. Odd Even Linked List
    237. Delete Node in a Linked List
    关于找List的中间Node
    234. Palindrome Linked List
    203. Remove Linked List Elements *
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6132158.html
Copyright © 2020-2023  润新知