javaweb文件下载

一、将所要下载的文件上传,文件上传代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;
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 UploadServlet4 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		try {
			//文件存储的路劲
			String storePath = getServletContext().getRealPath("/WEB-INF/files");
			
			//设置环境
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//判断表单的上传方式  form  enctype=multipart/form-data
			boolean isMulitpart = ServletFileUpload.isMultipartContent(request);
			if(!isMulitpart)
			{
				pw.write("上传方式有误!");
				return ;
			}
			//核心类
			ServletFileUpload upload = new ServletFileUpload(factory);
			//解析
			List<FileItem> items = upload.parseRequest(request);
			for(FileItem item: items)
			{
				if(item.isFormField())//是表单上的字段
				{
				  String name = item.getFieldName();//表单上字段名
				  String value = item.getString("UTF-8");//表单字段名的值
				 // System.out.println(name+"  "+value);
				}else
				{
					String fileName = item.getName();//文件名
					if(fileName==null || "".equals(fileName.trim()))//多文件上传的问题
					{
						continue;
					}
					//构建输入流
					InputStream in = item.getInputStream();
					//文件的真实路径      c:\files\bug\a.txt      a.txt
					fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
					fileName = UUID.randomUUID()+"_"+fileName;//sdhkgfkgf_a.txt
					//文件的存储路径
					String newStorePath = makeStorePath(storePath,fileName);
					
					String storeFile = newStorePath+"\\"+fileName; 
					//输出流
					OutputStream out = new FileOutputStream(storeFile);
					byte[] b = new byte[1024];
					int len = -1;
					while((len=in.read(b))!=-1)
					{
						out.write(b, 0, len);
					}
					in.close();
					out.close();
					item.delete();//删除临时文件
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		

	}

	private String makeStorePath(String storePath, String fileName) {
		//根据hash算法
		int hashCode = fileName.hashCode();
		int dir1 = hashCode&0xf;
		int dir2 = (hashCode&0xf0)>>4;
		String path = storePath+"\\"+dir1+"\\"+dir2;
		File file = new File(path);
		if(!file.exists())
		{
		   file.mkdirs();//创建多级目录	
		}
		return path;
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


二、要将上传的文件显示在jsp页面上

import java.io.File;
import java.io.IOException;
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;
//显示所有的files,封装到域对象中,交给jsp显示
public class ShowAllFilesServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Map<String,String> map = new HashMap<String, String>();
		//文件存储的位置
       String storePath = getServletContext().getRealPath("/WEB-INF/files");
	   //递归遍历所有的文件 ,将上传的文件封装到Map中,key为uuid value 为oldName
       File file = new File(storePath);
       //转向jsp显示
       //得到所有的文件
       treeWalk(file,map);
       //将所有的文件名保存到Map
       request.setAttribute("map", map);
       //转向jsp页面显示
       request.getRequestDispatcher("/listFiles.jsp").forward(request, response);
		
		
	}

	//遍历所有的文件夹,把所有文件名文件保存到Map中
	private void treeWalk(File file, Map<String, String> map) {

		if(file.isFile())//是文件
		{
			String uuidName = file.getName();
			String oldName = uuidName.substring(uuidName.indexOf("_")+1); 
			map.put(uuidName, oldName);//保存在Map中
		}else//是目录遍历目录下的所有文件是否为文件
		{
			File[] fs = file.listFiles();
			for(File f:fs)
			{
				treeWalk(f, map);
			}
		}
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		 doGet(request, response);
	}

}


三、在jsp显示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
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>My JSP 'listFiles.jsp' starting page</title>
    
	<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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <h1>网站有以下文件下载</h1>
   <br/>
   <c:forEach items="${map}" var="me">
   <c:url value="servlet/DownloadServlet" var="url">
    <c:param name="filename" value="${me.key}"></c:param>
   </c:url>
     ${me.value}<a href="${url}">下载</a><br/>
   </c:forEach>
  </body>
</html>

四、文件下载servlet

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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;
//文件下载
public class DownloadServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置编码
		response.setContentType("text/html;charset=UTF-8");
		OutputStream out = response.getOutputStream();
            //用的是get请求方式,解决乱码问题
		String filename = request.getParameter("filename");
		filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
		 String oldName = filename.split("_")[1]; 
		 System.out.println("有个IP为: "+request.getRemoteAddr()+" 正在下载 "+oldName);
		//得到存储路径
		String storePath = getServletContext().getRealPath("/WEB-INF/files");
		String filePath = makeStorePath(storePath,filename)+"\\"+filename;
		//判断文件是否存在
		File file = new File(filePath);
		if(!file.exists())
		{
			out.write("对不起,你要下载的文件可能已不存在!".getBytes("UTF-8"));//字节流输出,注意用UTF-8去写
			return;
		}
		//构建输入流
		InputStream in = new FileInputStream(file);
		//通知客户端下载方式,注意URLEncoder.encode(oldName, "UTF-8")oldName的编码问题
		response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(oldName, "UTF-8"));
		byte[] b = new byte[1024];
		int len =-1;
		while((len = in.read(b))!=-1)
		{
			out.write(b, 0, len);
		}
		in.close();
		out.write("下载成功!".getBytes("UTF-8"));
		out.close();
		
	}

	
	private String makeStorePath(String storePath, String filename) {
		int hashCode = filename.hashCode();
		int dir1 = hashCode & 0xf;
		int dir2 = (hashCode & 0xf0)>>4;
		String path = storePath+"\\"+dir1+"\\"+dir2;
		File file = new File(path);
		if(!file.exists())
		{
		  file.mkdirs();	
		}
		return path;
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值