//接收参数并解决乱码 String filename = new String(request.getParameter("filename").getBytes("iso-8859-1"),"utf-8"); //根据文件名称得到mime类型 String mimeType = this.getServletContext().getMimeType(filename); response.setHeader("Content-Type", mimeType); //获取浏览器相关信息 String agent = request.getHeader("User-Agent"); //判断是什么浏览器,根据不同浏览器解码 /* * 不同浏览器下载中文文件时解析文件编码不同,Firefox浏览器下载中文文件名的时候采用的是Base64的字符编码解码文件名. * 文件名是通过Content-Disposition消息带过去的,所以需要提前转换成URL或者Base64的编码后字符。过去才可以正常解码; */ if(agent.contains("Firefox")){ filename = base64EncodeFileName(filename); }else{ filename = URLEncoder.encode(filename,"UTF-8"); } //Content-Disposition该响应头告诉浏览器以什么方式处理,attachment值告诉以附件形式下载,filename值为附件显示名称。 response.setHeader("Content-Disposition", "attachment;filename="+filename); InputStream is = this.getServletContext().getResourceAsStream("/download/中文文件.rmvb"); ServletOutputStream os = response.getOutputStream(); int len = 0; byte[] a = new byte[1024]; while ((len=is.read(a)) != -1) { os.write(a,0,len); } is.close(); os.close();
public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } }
文件下载:
1.超链接下载,直接将文件路径写如href中(文件类型如果浏览器不支持会下载,如果支持会直接显示)
2.超链接下载,手动编写代码的方式完成文件下载
Content-Type :文件的MIME类型
Content-Disposition:以下载的形式打开文件
InputStream:文件的输入流