简单的文件上传下载

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:\a\b\1.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

 

posted @ 2017-03-16 14:01  一念花开满天下  阅读(329)  评论(0编辑  收藏  举报