java文件上传 下载(解决谷歌与火狐中文乱码问题)

文章目录

  • 文件上传
      • 需要 jar 依赖包(2个):
      • java Servlet 代码:
      • Upload.jsp 页面代码
  • 文件下载
      • 使用jar包(1个):
      • java Servlet 代码:

文件上传

需要 jar 依赖包(2个):

核心jar包: commons-fileupload-1.4.jar
辅助jar包: commons-io-2.6.jar

java Servlet 代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1. 创建文件工厂
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		// 2. 创建文件管理对象
		ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
		
		// 3. 判断是否有上传文件的操作
		if(servletFileUpload.isMultipartContent(request)) {
			try {
				// 当前有文件上传操作
				// 4. 解析request对象,将所有请求参数封装到list中
				List<FileItem> fileList = servletFileUpload.parseRequest(request);
				// 5. 遍历所有请求参数对象
				for (FileItem fileItem : fileList) {
					// 6. 判断是否为普通表单元素(上传文件不属于普通表单元素)
					if(fileItem.isFormField()) {
						// 7. 输出普通表单元素的name属性 值
						System.out.println(fileItem.getFieldName());
						// 8. 输出普通表单元素的value 值(以UTF-8格式解析)
						System.out.println(fileItem.getString("utf-8"));
					}else {
						//  *** 处理上传文件 ***
						// 9. 输出文件name属性 值
						System.out.println(fileItem.getFieldName());
						// 10. 获取文件名称 (1.jpg)
						System.out.println(fileItem.getName());
						// 11. 将文件写入磁盘 e 中(如果磁盘中有重名文件,则写入失败,抛出异常)
						fileItem.write(new File("e:\\" + fileItem.getName()));
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else {
			// 非上传文件的操作,request.getParameter() 普通方法处理
			System.out.println(request.getParameter("username"));
		}
		// 页面跳转
		response.sendRedirect(request.getContextPath() + "/DownLoad.jsp");
	}

Upload.jsp 页面代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form enctype="multipart/form-data"  action="/day_02/uploadServlet.action" method="post">
		username: <input type="text" name="username" />
		<hr />
		<input type="file" name="imgHead" accept=".jpg,.png">
		<hr />
		<button type="file" class="btn btn-info">上传文件</button>
	</form>
</body>
</html>

文件下载

使用jar包(1个):

输出输入流工具包: commons-io-2.6.jar

java Servlet 代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1. 获取下载文件名
		String downFileName = "小雪人.png";
		// 2. 通过ServletContenxt 对象 读取服务器上的下载文件
		ServletContext servletContext = getServletContext();
		InputStream downFileStream = servletContext.getResourceAsStream("/imgHead/" + downFileName);
		// 3. 告诉客户端返回的数据类型
		String mimeType = servletContext.getMimeType("/imgHead/" + downFileName);
		response.setContentType(mimeType);
		// 4. 告诉客户端是受到的数据使用与下载操作
//		response.setHeader("Content-Disposition", "attachment;filename=" + downFileName);
		// 4.1. 依据不同的浏览器返回文件下载信息(解决Chrome 与 FireFox 中文乱码问题)
		if(request.getHeader("user-Agent").contains("Firefox")) {
			response.setHeader("Content-Disposition", "attachment;filename==?UTF-8?B?" + new BASE64Encoder().encode(downFileName.getBytes("UTF-8")) + "?=" );
		}else {
			response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(downFileName, "UTF-8"));
		}
		// 5. 将读去的流形式的文件,复制给response的输出流,传回服务端
		OutputStream outputStream = response.getOutputStream();
		IOUtils.copy(downFileStream, outputStream);
	}

你可能感兴趣的:(java)