zoukankan      html  css  js  c++  java
  • 简单的文件上传下载

    1.文件的上传,在这里用到的是common-fileupload这一插件来做

      首先创建简单前台上传页面如下

      

    <form action="./servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">       
           		  上传文件1:<input type="file" name="file1"><br/>
            	 上传文件2:<input type="file" name="file2"><br/>
             	<input type="submit" value="提交">
           </form>
    

      创建一用来处理文件上传的servlet类UploadHandleServlet如下:

      

    package action;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.List;
    
    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;
    
    @SuppressWarnings("serial")
    public class UploadHandleServlet extends HttpServlet {
    
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		String path=this.getServletContext().getRealPath("/WEB-INF/upload");
    		File file = new File(path);
            if(!file.exists()&&!file.isDirectory()){
                System.out.println("目录或文件不存在!");
                file.mkdir();
            }
            String message="";
            try {
    	        //1、创建一个DiskFileItemFactory工厂
    	        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
    	        //2、创建一个文件上传解析器
    	        ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
    	        //解决上传文件名的中文乱码
    	        fileUpload.setHeaderEncoding("UTF-8");
    	        
    	        //3、判断提交上来的数据是否是上传表单的数据
    	        if(!fileUpload.isMultipartContent(request)){
    	            //按照传统方式获取数据
    	            return;
    	        }
    	        //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
    	        fileUpload.setFileSizeMax(1024*1024*100);
    	        //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
    	        fileUpload.setSizeMax(500*1024*1024);
    	        //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
    	        List<FileItem> list=fileUpload.parseRequest(request);
    	        for(FileItem item : list){
    	        	if(item.isFormField()){
    	        		//获取普通输入项的值
    	        		String name = item.getFieldName();
                        //解决普通输入项的数据的中文乱码问题
                        String value = item.getString("UTF-8");
    	        	}else{
    	        		//如果fileitem中封装的是上传文件,得到上传的文件名称,
                        String fileName = item.getName();
                        System.out.println(fileName);
                        if(fileName==null||fileName.trim().equals("")){
                            continue;
                        }
                        //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:a1.txt,而有些只是单纯的文件名,如:1.txt
                        //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                        fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);
                        //获取item中的上传文件的输入流
                        InputStream is = item.getInputStream();
                        //创建一个文件输出流
                        FileOutputStream fos = new FileOutputStream(path+File.separator+fileName);
                        //创建一个缓冲区
                        byte buffer[] = new byte[1024];
                        //判断输入流中的数据是否已经读完的标识
                        int length = 0;
                        //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                        while((length = is.read(buffer))>0){
                            //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\" + filename)当中
                            fos.write(buffer, 0, length);
                        }
                        message="文件上传成功";
                        //关闭输入流
                        is.close();
                        //关闭输出流
                        fos.close();
                        //删除处理文件上传时生成的临时文件
                        item.delete();
    	        	}
    	        }
    		} catch (FileUploadException e) {
    			message="文件上传失败";
    			e.printStackTrace();
    		}
            request.setAttribute("message",message);
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		 doGet(request, response);
    	}
    
    	
    }
    

      其次文件下载,需要先获取到文件列表,以供用户选择需要下载的文件:

      

    package action;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ListFileServlet extends HttpServlet {
    
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		doPost(request, response);
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		 //获取上传文件的目录
            String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
            //存储要下载的文件名
            Map<String, String> fileMap = new HashMap<String, String>();
            //递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中
            //将指定路径读入file
            File file=new File(uploadFilePath);
            fileList(file,fileMap);
            //将Map集合发送到listfile.jsp页面进行显示
            request.setAttribute("fileMap", fileMap);
            request.getRequestDispatcher("/listfile.jsp").forward(request, response);
    	}
    
    	//递归遍历指定目录下的所有文件
        public void fileList(File file,Map fileMap){
            //如果file代表的不是一个文件,而是一个目录
            if(!file.isFile()){
                //列出该目录下的所有文件和目录
                File[] files = file.listFiles();
                //遍历files[]数组
                for (File file2 : files) {
                    System.out.println(file2.getName());
                    //递归
                    fileList(file2, fileMap);
                }
            }else{
                String realName = file.getName().substring(file.getName().lastIndexOf("_")+1);
                //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
                fileMap.put(file.getName(), realName);
            }
        }
    }
    

      与之对应的JSP页面显示获取到的文件信息:

      

     <!-- 遍历Map集合 -->
         <c:forEach var="me" items="${fileMap}">
             <c:url value="./servlet/DownLoadServlet" var="downurl">
                 <c:param name="filename" value="${me.key}"></c:param>
             </c:url>
             ${me.value}<a href="${downurl}">下载</a>
             <br/>
         </c:forEach>
    View Code

    加入新的servlet类文件来处理文件下载:

      

    package action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @SuppressWarnings("serial")
    public class DownLoadServlet extends HttpServlet {
    
        
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            doPost(request, response);
        }
    
        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            //得到要下载的文件名
            String fileName = request.getParameter("filename");
            
            fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
            System.out.println(fileName);
            //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
            String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");
            System.out.println(fileSaveRootPath);
            //处理文件名
             String realname = fileName.substring(fileName.indexOf("_")+1);
             System.out.println(realname);
            //通过文件名找出文件的所在目录
            //String path = findFileSavePathByFileName(fileName,fileSaveRootPath);
            //System.out.println(fileSaveRootPath+"\"+realname);
            //System.out.println(File.separator);
            //得到要下载的文件
            File file = new File(fileSaveRootPath+File.separator+realname);
            //如果文件不存在
            if(!file.exists()){
                request.setAttribute("message", "您要下载的资源已被删除!!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
            
             //设置响应头,控制浏览器下载该文件
             response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
             //读取要下载的文件,保存到文件输入流
             FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + fileName);
             //创建输出流
             OutputStream fos = response.getOutputStream();
             int b; 
             while((b=fis.read())!= -1)  
                {
                    fos.write(b);  
                }  
             //关闭输入流
             fis.close();
             //关闭输出流
             fos.close();
        }
    
        public String findFileSavePathByFileName(String fileName,String fileSaveRootPath){
            int hashcode = fileName.hashCode();
            int dir1 = hashcode&0xf;
            int dir2 = (hashcode&0xf0)>>4;
            String dir = fileSaveRootPath + "\" + dir1 + "\" + dir2;
            File file = new File(dir);
            if(!file.exists()){
                file.mkdirs();
            }
            return dir;
        }
    
    }
    View Code
  • 相关阅读:
    crt key转p12, jks p12互转,windows生成jks,
    使用c语言实现在linux下的openssl客户端和服务器端编程
    AES CFB/OFB/ECB/CBC/CTR优缺点
    SSL握手通信详解及linux下c/c++ SSL Socket代码举例
    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
    对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
    Mosquitto服务器的搭建以及SSL/TLS安全通信配置
    openssl详解
    使用 openssl 生成证书
    字符编码的故事:ASCII,GB2312,Unicode,UTF-8,UTF-16
  • 原文地址:https://www.cnblogs.com/feitianshaoxai/p/6559183.html
Copyright © 2011-2022 走看看