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

文件上传

需要 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);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的InputStream是用于读取输入流的类,可以用来从一个源(如文件、网络连接、内存等)中读取数据。而火狐浏览器中,使用Java实现文件下载功能通常需要以下几个步骤: 1. 创建一个用于导出文件的Servlet或Controller 在Java Web项目中,可以创建一个Servlet或者Spring MVC的Controller来处理文件下载的请求。 2. 设置响应头信息 在Servlet或Controller中,需要设置响应头信息来告诉浏览器需要下载的文件的名称、类型等内容。可以使用`response.setHeader()`方法来设置响应头信息,例如: ``` response.setHeader("Content-Disposition", "attachment; filename=filename.txt"); ``` 这样就会告诉浏览器下载的文件名为filename.txt。 3. 获取文件输入流 通过Java代码获取文件的输入流,可以使用FileInputStream等类来读取文件数据,将文件内容写入到响应的输出流中,例如: ``` InputStream input = new FileInputStream(file); ``` 4. 写入响应流 通过response.getOutputStream()方法获取输出流,将文件的输入流数据写入到输出流中,实现文件下载,例如: ``` OutputStream output = response.getOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } ``` 完成以上步骤后,浏览器就会出现文件下载的提示,并下载指定的文件。在火狐浏览器中,会根据设置的响应头信息进行文件下载处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值