多类型文件预览和下载 以及处理txt乱码 兼容手机端

文件预览和下载

最近公司里面有个手机微信端的文件预览跟下载功能,文件类型包括

  • txt.pdf.doc.docx.xls.xlsx.rar.zip

首先。是下载,这个是在web上开发的,首先我用的是window.open(),然后。。。到测试的时候就炸了。原因是这东西在电脑显示的是下载,但在手机上面的是直接预览,而且txt文件还是乱码

于是乎。。。我的预览功能一不小心用下载的方式实现了。。。
下载,我用的是后台获取linux服务器文件,以流的形式生成新的文件下载
,前台只需传入一个参数文件的绝对路径,fileName如:/upload/file/org00000000/20190428/38a9921cd62a4273bfc5b055de456070.docx (这里的是linux 下的文件路径)
代码如下

public void downLoadFile() {
     
		HttpServletRequest req = ServletActionContext.getRequest();
		HttpServletResponse rep = ServletActionContext.getResponse();
		BufferedOutputStream bufout=null;
		InputStream in = null;
		BufferedInputStream bufin =null;
		OutputStream out = null;
		ServletOutputStream os =null;
		URL url = null;
		HttpURLConnection urlconn = null;
		try {
     
			String[] str=fileName.split("/");
			String newFileName=str[str.length-1];//截取源文件的文件名作为文件的文件名
			rep.setContentType("multipart/form-data");
			rep.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(newFileName,"utf-8"));
			//创建url连接
			url = new URL("服务器域名(不方便展示)"+fileName);
			urlconn = (HttpURLConnection) url.openConnection();
			urlconn.connect();
//			File file = new File(fileName);

			bufin = new BufferedInputStream(urlconn.getInputStream());
			File newFile = new File("域名//"+fileName);
//			out = new FileOutputStream(newFile);
			os=rep.getOutputStream();
			bufout= new BufferedOutputStream(os);
			byte[] bytes = new byte[2048];
			int length=0;

			while((length=bufin.read(bytes))!=-1){
     
				bufout.write(bytes,0,length);
			}
		} catch (FileNotFoundException e) {
     
			e.printStackTrace();
		} catch (IOException e) {
     
			e.printStackTrace();
		}finally {
     
			try {
     
				bufin.close();
				bufout.close();
				os.close();
				urlconn.disconnect();
			} catch (IOException e) {
     
				e.printStackTrace();
			}

		}

		doJsonOut();
	}

实现下载的docx文件下载如下多类型文件预览和下载 以及处理txt乱码 兼容手机端_第1张图片
这种方式的好处就是下载的txt,xls都不会乱码,而且兼容多种文件格式,而且。。。copy基本就可以直接使用,不需要用到任何插件(网上找了两天,下载的方法花式百样,总结就是一个字,坑)

预览使用window.open(), txt会出现乱码问题

这个,其实我问了一些大神,他的回答是新建一个jsp文件返回字符串不就行了吗
我咧个去。。。我百度找了那么久的问题结果就一句话被解决的。。然后,我把上面的方法修改了一下,把流转成字符串,然后,新建个viewfile.jsp 。。。嘿嘿嘿
由于项目使用了struts ,所以返回的类型是用request.setAttribute的方式,直接在新的页面获取就行了
代码基本差不多,如下:

public String viewFile(){
     
		HttpServletRequest req = ServletActionContext.getRequest();
		HttpServletResponse rep = ServletActionContext.getResponse();
		BufferedOutputStream bufout=null;
		InputStream in = null;
		BufferedInputStream bufin =null;
		OutputStream out = null;
		ServletOutputStream os =null;
		URL url = null;
		HttpURLConnection urlconn = null;
		try {
     
			String[] str=fileName.split("/");
			String newFileName=str[str.length-1];//截取源文件的文件名作为文件的文件名
			rep.setCharacterEncoding("UTF-8");
			rep.setContentType("html/text");
			//创建url连接
			url = new URL("域名/"+fileName);
			urlconn = (HttpURLConnection) url.openConnection();
			urlconn.connect();
//			File file = new File(fileName);
			bufin = new BufferedInputStream(urlconn.getInputStream());
			File newFile = new File("域名/"+fileName);
//			out = new FileOutputStream(newFile);
//			os=rep.getOutputStream();
//			bufout= new BufferedOutputStream(os);
			byte[] bytes = new byte[2048];
			int length=0;
			String content="";
			while((length=bufin.read(bytes))!=-1){
     
//				bufout.write(bytes,0,length);
				content+=new String(bytes,"utf-8");
			}
			req.setAttribute("content",content);
		} catch (FileNotFoundException e) {
     
			e.printStackTrace();
		} catch (IOException e) {
     
			e.printStackTrace();
		}finally {
     
			try {
     
				bufin.close();
//				bufout.close();
//				os.close();
				urlconn.disconnect();
			} catch (IOException e) {
     
				e.printStackTrace();
			}
		}

		return "viewfile";
	}

下面是方法入口,大同小异而已
多类型文件预览和下载 以及处理txt乱码 兼容手机端_第2张图片
viewfile.jsp 页面 简单,粗暴
多类型文件预览和下载 以及处理txt乱码 兼容手机端_第3张图片
功能显示
多类型文件预览和下载 以及处理txt乱码 兼容手机端_第4张图片

博主还遇到了一个跟恶心的问题。。。js不兼容。。

所有测试人员测试完都没问题了。。然后。。项目经理一测,卧槽,又炸了。。。

按钮那些都显示不了
原因只是。。。那土豪用的是苹果,我咧个去,,,几个大佬的一个个调试,都发现不了问题,我走了一下流程,发现一到判断时间类型下面的js都失效了。

百度一看,好嘛,这苹果货不兼容 yyyy-MM-dd 的时间格式,除此之外还不兼容绑定的按钮点击事件,略作修改,写成yyyy/MM/dd,换一下绑定,完美渡劫成功,

卧槽,肝了一个月的项目,终于弄完了,博主今晚吃饭要加菜,至少也要加个鸡腿

下边加个判断时间类型的js的吧
时间类型 yyyy/MM/dd, 具体yyyy-MM-dd能不能用没测试过,有测试成功的小伙伴可以留个言提醒一下别人。。。
功能,比较传入来的时间(String 类型)与当前时间的大小,(精确到分,需要更精确的只要你认真看一下就知道怎么修改了)

 function betterNow(endTime){
     
        var mydate = new Date();
        var inputDate=new Date(endTime);
        if(inputDate>mydate){
     
            return true
        }else
            return false;
    }

对了,我还有一句话想说

iphone就是个辣鸡~~~~~~~~

你可能感兴趣的:(java,web)