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 ...
随机推荐
- STM32F103片外运行代码分析
STM32F103片外运行代码分析 STM32F103有三种启动方式: 1.从片内Flash启动: 2.从片内RAM启动: 3.从片内系统存储器启动,内嵌的自举程序,用于串口IAP. 无法直接在片外N ...
- ucos问题
1. 在系统初始化之前,不要调用系统函数,如下: void OSRun(void) { SYSTICK_InternalInit(1); // 1ms time tick SYSTICK_IntCmd ...
- hadoop-1.2.1分布式配置启动问题
关键配置(core-site.xml 和hdfs-site.xml)(这里只是针对与HDFS,没有启动MapReduce): core-site.xml <?xml version=" ...
- DIAView组态软件笔记
1.为了节省成本,我们往往会在PLC将多个开关量整合到同一个word中,这样关联的变量可以从原有的16个变成现在的一个.这样做带来的麻烦就是需要我们在脚本中自己来解析出数据,通过对2求余(mod 2) ...
- 初学pygame
#Author:cljimport pygamepygame.display.set_mode((640,480),0,32)#设置窗口大小 返回的也是一个surface对象,resolution可以 ...
- Oracle登录失败:监听程序当前无法识别连接描述符中请求的服务
Oracle11g下载地址:https://pan.baidu.com/s/1p3RwLUTAl1Ys4yXmXJ3OVQ 安装步骤视频链接:https://pan.baidu.com/s/1c0FC ...
- .net第三方数据库物理卡号同步功能实现
本地数据库用的是Oracle,第三方数据库是SQL Server,连接字符串保存在web.config里面. 第三方数据库为增量,每次读取要记录读取的最大位置.我是保存在本地txt文件里面. //保存 ...
- 用matplotlib库画图
1.用例一 import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) y=np.cos(2*np.pi*x) ...
- centos install rabbitmq
安装rabbitmq 需要环境上有erlang,没有安装的可以参照下面的内容进行安装: https://www.erlang-solutions.com/resources/download.html ...
- python学习笔记二:if语句及循环语句,断点,模块,pyc
if语句 注意:语句块中的内容要强制缩进,否则出错.IndentationError,缩进错误 所有代码,如果是顶级的,必须顶格写,前面不能有空格 if … : … elif … : … else: ...