废话不多说,直接上代码:
public void downloadChineseFileByOutputStream(HttpServletRequest req,
? ? HttpServletResponse response,@RequestParam("path") String path) ?
? ? ? ? ? ? throws FileNotFoundException, IOException { ?
? ? ? ? String realPath = path;//req.getSession().getServletContext().getRealPath(path);//获取要下载的文件的绝对路径 ?
? ? ? ? String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//获取要下载的文件名 ?
? ? ? ??
? ? ? ? String agent = req.getHeader("USER-AGENT").toLowerCase();
? ? ? //根据浏览器类型处理文件名称 ? ?处理火狐浏览器下载文件名乱码
? ? ? ? if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)
? ? ? ? {
? ? ? ? fileName = ?new String(fileName.getBytes("UTF-8"),"ISO-8859-1"); ??
? ? ? ? }
? ? ? ? else//其他浏览的中文名称编码
? ? ? ? {
? ? ? ? fileName = ?java.net.URLEncoder.encode(fileName, "UTF-8");
? ? ? ? }
? ? ? ??
? ? ? ? //设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码 ?
? ? ? ? response.reset();
? ? ? ? response.setHeader("content-disposition", "attachment;filename="+fileName); ?
? ? ? ? response.setContentType("application/octet-stream"); ?
? ? ??
? ? ? ? URL url = new URL(realPath); ??
? ? ? ? HttpURLConnection uc = (HttpURLConnection) url.openConnection(); ?
? ? ? ? uc.setDoInput(true);//设置是否要从 URL 连接读取数据,默认为true ?
? ? ? ? uc.connect(); ?
? ? ? ? InputStream in = uc.getInputStream();?
? ? ? ?/* File file = new File(realPath);
? ? ? ? InputStream in = new FileInputStream(file);*/
? ? ? ?
? ? ? ? int len = 0; ?
? ? ? ? byte[] buffer = new byte[1024]; ?
? ? ? ? OutputStream out = response.getOutputStream(); ?
? ? ? ? while ((len = in.read(buffer)) > 0) { ?
? ? ? ? ? ? out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器 ?
? ? ? ? ? ? out.flush();
? ? ? ? }?
? ? ? ? out.close();
? ? ? ? in.close();
? ? }?