TW实习日记:第29-30天
这两天挺忙,赶工期,改bug。项目现场的同事说客户火大得不行。可是谁叫你们谈工期谈的这么紧,完全不考虑开发的情况,真的是烦人这种事情。这两天遇到的最有难度的一个点就是附件预览,搞这个改到晚上11点。
其实这个功能其实也不难,按理说还特别简单,因为只需要返回前端一个文件的URL地址就行了。但是呢,项目的网端服务器上的文件,前端通过地址不知道为什么无法访问,显示没有访问权限,同事说是跨域的问题。具体我也不了解这些偏前端的东西,所以没办法,就只能通过我自己写的后台向文件的URL做一些处理。通过同事的一些讲解,我知道了如果要让浏览器打开文件而不是下载的话,就需要改响应头的一些参数。
response.setContentType("application/pdf");//这个要根据文件的后缀名来动态判断,这是告诉浏览器这个页面的内容是什么类型,需要怎么解读
response.setHeader("Content-Disposition","inline");//这个参数就是告诉浏览器这个文件是预览形式,而不是点击后下载
主要的参数就是这两个,通过这两个来达到预览附件的效果。贴一下我完整的处理预览附件的代码:
public void openFile(){
String u = request.getParameter("url");
BufferedInputStream in = null;
ByteArrayOutputStream out = null;
//首先我采用的方式是使用字节流的方式,读取文件的字节流并保存,然后再将文件的字节流全部写入到响应中,直接输出在浏览器上,达到预览附件的效果
try{
u = URLDecoder.decode(u,"utf-8");
URL url = new URL(u);
in = new BufferedInputStream(url.openStream());
out = new ByteArrayOutputStream(1024);
byte[] temp = new byte[1024];
int size = 0;
while ((size = in.read(temp)) != -1) {
out.write(temp, 0, size);
}
in.close();
byte[] content = out.toByteArray();
File file = new File(u);
String fileName = file.getName();
//动态处理响应头的contentType参数,不过这里我写的判断语句非常啰嗦,如果有更好的形式可以告诉我,谢谢
if(file.getName().lastIndexOf(".") > 0){
String extention = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); if ("txt".equalsIgnoreCase(extention)) {
response.setContentType("text/plain;charset=gbk");
} else if ("pdf".equalsIgnoreCase(extention)) {
response.setContentType("application/pdf");
} else if ("doc".equalsIgnoreCase(extention)) {
response.setContentType("application/msword");
} else if ("docx".equalsIgnoreCase(extention)) {
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
} else if ("xls".equalsIgnoreCase(extention)) {
response.setContentType("application/vnd.ms-excel");
} else if ("xlsx".equalsIgnoreCase(extention)) {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
} else if ("jpg".equalsIgnoreCase(extention) || "jpeg".equalsIgnoreCase(extention)) {
response.setContentType("image/jpeg");
} else if ("png".equalsIgnoreCase(extention)) {
response.setContentType("image/png");
} else if ("gif".equalsIgnoreCase(extention)) {
response.setContentType("image/gif");
} else if ("htm".equalsIgnoreCase(extention) || "html".equalsIgnoreCase(extention)) {
response.setContentType("text/html;charset=gbk");
}
}
response.setHeader("Content-Disposition","inline");
response.getOutputStream().write(content); }catch (Exception e){
e.printStackTrace();
}
}
最后后台代码其实写的很快,当天晚上写好后台之后,却一直没有效果。我也不知道哪里出了问题,在项目中就是没有效果。我部署了n次却一点改变都没有...结果最后用safari打开,却发现地址都不是我修改过后的地址。然后就让我想到了该不会我的手机浏览器缓存了我之前的JS脚本代码把,所以我就在微信浏览器中刷新了一下页面,然后就成功了...找这个原因找了我可能有一个多小时,这个惨痛的教训告诉我以后做前端的东西要有清除缓存的好习惯...
挖坑清单:
- Vue缓存机制、生命周期和钩子函数
- git学习与常用命令记录(最后的整理)
- 和czh开发练习博客demo(建表完成度1/3)
- 学习Java多线程基础
- 学习Java网络编程
Terence Xie
2018.8.25 周六 14:20
TW实习日记:第29-30天的更多相关文章
- TW实习日记:前三天
今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ...
- TW实习日记:第九天
这两天有点忙,要改前端网页和加需求上去.所以昨天说的Vue缓存机制也没看,所以打算现在列个挖了的坑的清单: Vue缓存机制.生命周期和钩子函数 使用项目组自用组件来重写静态页面 SSM框架搭建.整合流 ...
- TW实习日记:第七天
今天早上,将项目的两个企业微信接口:登录和应用消息发送接口,做了最后的收尾工作,把目前我能解决的问题算是基本都解决了.早上还开了一个会,大意是组长封装了许多组件叫我们使用,在不断的使用中打磨组件的可用 ...
- TW实习日记:第31-32天
不知不觉的,实习的净工作天数,已经都超过一个月了.因为对工作内容不是很满意,所以打算月底离职,也不知道是公司太缺人还是我真的能干活,领导竟然三番两次找我让我再考虑...明天又要找我了,哎...随机应变 ...
- TW实习日记:第四天
第四天 早上第一件事就是和组长说前一天的需求的事,简而言之就是两个导航栏不属于一个标签内,自定义导航栏属于<body>下的<header>,微信顶部的则是<head> ...
- TW实习日记:第十天
今天任务很简单,就是出品项目的时间轴显示页面和动态路由设置.其实时间轴页面很快就做完了,在做完处理完数据之后,然而有很多细节需要打磨,这就又考验了我面向搜索引擎编程的能力,根据需求百度了很多css的样 ...
- TW实习日记:第八天
今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...
- TW实习日记:第六天
今日的一整天都是在开发微信相关的接口,因为项目的系统是嵌在企业微信中,所以不可避免的要产生微信UserID和企业系统ID的匹配关系,那么就需要用手机号或是邮箱这种两边都存在的唯一参数进行匹配.然后再将 ...
- TW实习日记:第五天
今天可以说是非常忙的一天了,要再项目中实现微信相关的功能:授权登录以及扫码登录,还有就是自建应用的发送消息.首先功能代码其实在经过了几天的学习之后并没有很难,但是最让我难受的是在项目中去加代码,首先s ...
- TW实习日记:第28天
同前两天一样,等接口,开发,调试接口.重复地做着低级代码得搬运工作,确实挺没意思的.怪不得有些人一直说写低级代码很无聊,没有创造性和成就感.31号准备溜了,还是好好复习准备秋招吧. 挖坑清单: Vue ...
随机推荐
- MVC学习十:MVC 特性作用和MVC 验证
根据代码分析特性用处 [DisplayName("学员名")] [DataType(DataType.Text)] [StringLength(,ErrorMessage=&quo ...
- 点击HTML页面问号出现提示框
本demo的功能:点击页面按钮在其边缘出现提示信息,点击页面任何一处则消失. 如下图: 1.所需插件: jquery插件: layer插件: 2.HTML内容: ==注意==: class=" ...
- 大型网站系统与java中间件实践-阅读笔记
线程池 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, Bl ...
- SQLMAP使用详解
使用示例 python sqlmap.py -u "http://xx.com/member.php?id=XX" -p id --dbms "Mysql" ...
- Redis与Python进行交互
安装包 安装Redis的有3种方式https://github.com/andymccurdy/redis-py 第一种:进⼊虚拟环境,联⽹安装包redis pip install redis 第二种 ...
- sqlserver 导出数据库表结构
https://www.cnblogs.com/miaomiaoquanfa/p/6909835.html SELECT 表名 = case when a.colorder=1 then d.name ...
- WSO2 API Manager中host Ip 不正确的问题解决方法
问题: 根据官方的Quick start的教程,部署完AM后,添加的API的host Ip不正确,为localhost或者服务器上的其他虚拟ip. 安装版本: WSO2AM 2.6.0 环 ...
- UIDynamic-吸附-重力-碰撞-物理仿真动画
现实生活中: 运动场==物理仿真器 跑步==物理仿真行为 人==仿真元素 创建步骤: 1.创建物理仿真器,并且指定仿真范围 2.创建物理仿真行为,并且指定仿真元素 3.将物理仿真行为添加到仿真器中 D ...
- iOS 12 真机调试 Xcode 9 提示 Could not locate device support files.
升级 iOS 12 之后,使用 Xcode 9 真机调试会提示错误: Could not locate device support files. This iPhone 6 Plus is runn ...
- hadoop生态搭建(3节点)-11.storm配置
# http://archive.apache.org/dist/storm/apache-storm-1.1.0/ # ======================================= ...