PC端文件下载及手机端在线阅览

        /**
	 * 文件下载
	 * 
	 * @param filePath
	 *            下载文件的完整路径
	 * @param response
	 *            响应对象
	 * @throws IOException
	 */
	public static boolean download(HttpServletRequest request, String filePath,String file,String fileType, HttpServletResponse response) {

		// 将服务器上的文件写入本地文件
		OutputStream outputStream = null;
		// 读取服务器上的文件信息
		InputStream inputStream = null;
		// 文件名,输出到用户的下载对话框
		String fileName = null;
		try {
			if (filePath.lastIndexOf("/") != -1) {   
				fileName = filePath.substring(filePath.lastIndexOf("/") + 1);			
			} else if (filePath.lastIndexOf("\\") != -1) {
				fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);			
			}
			fileName = file +"."+fileType;
			// 从文件完整路径中提取文件名,转码是防止中文不能正确显示
			if (request.getHeader("User-Agent").contains("firefox")==true) {
				fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// firefox浏览器
				response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName+"\"");
			} else if (request.getHeader("User-Agent").contains("MSIE")==true) {
				fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器  
				fileName = StringUtils.replace(fileName, "+", "%20");//替换空格
				response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
			}else{
				String name = fileName;  
				if(name.indexOf("Android") == -1){
					iosViewFile(request, response, filePath, name, fileType);
				}else{
					String userAgent = request.getHeader("User-Agent"); 
					byte[] bytes = userAgent.contains("MSIE") ? name.getBytes() : name.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题  
			        name = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码  
			        response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name));
				}
			}
			if(fileName.indexOf("iPhone") == -1){
				inputStream = new FileInputStream(filePath);
				response.setContentType("text/plain");
				response.setHeader("Location", fileName);
				outputStream = response.getOutputStream();
				byte[] buffer = new byte[1024];
				int i = -1;
				while ((i = inputStream.read(buffer)) != -1) {
					outputStream.write(buffer, 0, i);
				} 
			}
		} catch (Exception e) {
			log.error("下载失败", e);
			return false;
		} finally {
			try {
				if (outputStream != null) {
					outputStream.flush();
					outputStream.close();
				}
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
				log.error("关闭流失败", e);
			}
		}
		return true;
	}
	/**
	 * IOS在线阅览文档
	 * @param request 请求
	 * @param response 响应
	 * @param fileFullPath 文件路径
	 * @param attachName 文件名称
	 * @param fileType 文件类型
	 * @param ret
	 */
	private static void iosViewFile(HttpServletRequest request, HttpServletResponse response, String fileFullPath, String attachName, String fileType) {
		File file = new File(fileFullPath);
		if (file.exists() && file.isFile()) {
			synchronized(file){
				OutputStream outPutStream = null;
				InputStream inputStream = null;
				BufferedInputStream buff = null;
				try {
					response.reset();
					response.setHeader("Content-Disposition", "attachment;fileName=" + new String(attachName.getBytes("utf-8"), "iso-8859-1"));
					response.setContentType("application/octet-stream");
				    response.setContentLength((int) file.length());
					inputStream = new FileInputStream(file);
					buff = new BufferedInputStream(inputStream);
					outPutStream = response.getOutputStream();
					byte[] b = new byte[1024];
					int len=0;
					while ((len = buff.read(b, 0, 1024))>0) {
						outPutStream.write(b,0,len);
						outPutStream.flush();
					}
					outPutStream.close();
					buff.close();
					inputStream.close();
				}catch (Exception e) {
					log.error("下载文件时发生异常" + e.getMessage() + "附件Id:" + fileFullPath);
				} finally {
					try {
						if (null != outPutStream) {
							outPutStream.close();
						}
						if (null != inputStream) {
							inputStream.close();
						}
						if (null != buff) {
							buff.close();
						}
					} catch (IOException e) {
						//e.printStackTrace();
					}
				}
			}
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值