多类型文件预览和下载 以及处理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,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";
}
下面是方法入口,大同小异而已
viewfile.jsp 页面 简单,粗暴
功能显示
博主还遇到了一个跟恶心的问题。。。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;
}
对了,我还有一句话想说