如何用java代码实现上传文件和下载文件(笔记)

如何用java代码实现上传文件:
首先创建一个项目创建index.jsp页面如下

只要是上传文件就要使用form标签的enctype属性:

 <!--只要是涉及到上传文件 enctype="multipart/form-data" -->
    <form action="UploadServlet" method="post" enctype="multipart/form-data">
    		<input type="text" name="user">
    		<input type="file" name="fName">
    		<input type="submit" value="上传">
    </form>

之后创建UploadServlet,servlet当提交上传的文件之后进行处理:

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

		//上传文件
		//一般都会保存到项目里面去
		String pathString=this.getServletContext().getRealPath("/WEB-INF/Upload");
		//判断路径是否存在
		File file=new File(pathString);
		if (!file.exists()&& !file.isDirectory()) {
				//如果目录不存则创建
			System.out.println("创建路径");
			file.mkdir();
		}
		//接下来就是servlet控制台的区别
		//1、创建文件上传的工厂
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//2、创建文件解析的工具
		ServletFileUpload upload=new ServletFileUpload(factory);
		//解决中文乱码的问题
		upload.setHeaderEncoding("UTF-8");//设置好请求头部的字符编码
		//3、判断提交上传的数据是否是上传表单的数据
		//通过jar判断请求的request对象是否为上传表单
		if (!ServletFileUpload.isMultipartContent(request)) {
			return;//如果不是则直接return 不往下面走
		}
		//4、使用文件工具对象, 去解析表单 使用工具解析我们上传的所有数据
		try {
			
			List<FileItem> list= upload.parseRequest(request);
			//把整个表单的数据解析, 然后封装成list的集合
			
			for (FileItem fileItem : list) {
				//要区分是普通的文本框还是文件筐
				if (fileItem.isFormField()) {//普通的
					String nameString=fileItem.getFieldName();//拿到属性名
					String valueString=fileItem.getString("UTF-8");
					System.out.println(nameString+valueString);
					
				}else{//文件的
					String fileNameString=fileItem.getName();
					System.out.println(fileNameString);
					
					//5、创建输入流和输出流
					InputStream inputStream=fileItem.getInputStream();
					FileOutputStream outputStream=new FileOutputStream(pathString+"\\"+fileNameString);
					
					byte[] bytes=new byte[1024];
					int i=0;
					//循环将输入到数组里面如果大于0说明还有数据
					while ((i=inputStream.read(bytes))>0) {
						
						outputStream.write(bytes,0,i);
					}
					//关闭资源
					inputStream.close();
					outputStream.close();
				}
			}
		} catch (FileUploadException e) {
			
			e.printStackTrace();
		}
	}

这样就完成了文件的上传,接着直接到你的Tomcat项目找到你的webapps—>你的项目名字…
在这里插入图片描述
就可以看到你上传的文件了。
接下来是下载:
首先我们需要把指定的文件读取出来在页面中显示:创建一个servlet,DownLoadListServlet:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			//我们要把所有下载的文件加载到页面里面
			String downPath=this.getServletContext().getRealPath("/WEB-INF/upload");
			
			//System.out.println("完整路径是:"+downPath);
			//获取当前下载列表的路径
			//创建一个存储文件名的集合
			Map<String, String> fileList=new HashMap<String, String>();
			File file=new File(downPath);//该目录可以是文件也可以是目录
			list(file, fileList);
			request.getSession().setAttribute("fileList",fileList);
			response.sendRedirect("download.jsp");
	}
	/**
	 * 通过该方法吧所有的文件插入到集合里面
	 * @param file
	 * @param map
	 */
	public void list(File file,Map<String, String> map){
		//判断我们传入进来的file是一个文件还是一个目录
		if (file.isFile()) {//这里是一个文件是true
			map.put(file.getName(), file.getName());
		}else {//不是文件而是一个目录
			File[] files=file.listFiles();//把所有的文件拿到手
			for (File f : files) {
				list(f,map);//使用递归除非是文件才插入
			}
		}
	}

当我们获取到文件之后跳转到download.jsp显示:使用的是EL和标签库输出数据

  <!-- 遍历一下map集合 -->
    <c:forEach var="me" items="${fileList}">
    	<c:url value="DownloadFileServlet" var="downurl">
    		<c:param name="fileName" value="${me.key}"></c:param>
    		</c:url>
    		${me.value}<a href="${downurl}">下载</a> 	
    </c:forEach>

在这里插入图片描述
点击下载的时候跳转到DownloadFileServlet,servlet进行处理:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		String fileNameString=request.getParameter("fileName");
		//用户选择下载的文件名拿到手
		
		//因为我们的路径保存在upload
		String path=this.getServletContext().getRealPath("/WEB-INF/upload");
		//要在当前的路径里面找到文件夹的路径
		File file=new File(path+"\\"+fileNameString);
		
		//确保我们下载的文件真实存在的
		if (!file.exists()) {
			//如果不存在这不用下载
			return;
		}
		response.setHeader("content-disposition", "attachment;filename="
		+URLEncoder.encode(fileNameString,"UTF-8"));
		//设置响应头控制浏览器下载该文件
		InputStream inputStream=new FileInputStream(file);
		//输入流
		OutputStream out=response.getOutputStream();
		
		//创建缓冲区
		byte [] bytes=new byte[1024];
		int i=0;
		while ((i=inputStream.read(bytes))>0) {
			out.write(bytes,0,i);			
		}
		inputStream.close();
		out.close();
	}

当我们点击下载的时候就成功了!
在这里插入图片描述

发布了152 篇原创文章 · 获赞 141 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_44739706/article/details/104805269