[chnechen的随笔]我发现我似乎是个跟不上时代潮流的人,比如可以从如今人气极旺的丁俊晖谈起,顺便纪念一下那些热衷于斯诺克的日子..

我发现我似乎是个跟不上时代潮流的人,比如可以从如今人气极旺的丁俊晖谈起,顺便纪念一下那些热衷于斯诺克的日子..


忘了自己开始看斯诺克的具体日期,大概应该是在95年前后吧,因为好象记得在只有CCTV1、2的日子是看不到斯诺克的转播的,CCTV5开播之时很喜欢播一些奇怪的运动的录像,可惜现在却很少见了,比如我曾经很怀念的冰壶,当然也包括斯诺克界赫赫有名的全英锦标赛,记得当时是史蒂芬·亨得利(Stephen Hendry)开创时代的初期,可惜我却更喜欢史蒂夫·戴维斯(Steve Davis)的优雅和当时初出茅庐的罗尼·奥沙利文(Ronnie O'Sullivan),不得不承认,初出茅庐的奥沙利文还是毛糙了很多,记得全英赛上他和亨得利的一次VS,多次局面领先却总是在关键一两杆上功亏一篑,当然,二十年河东二十年河西,现在做为NO.1的他,自然多次从亨得利身上要回过旧账了..
遗憾的是爱尔兰名将肯·达赫蒂(Ken Doherty),也许真是命运不济吧, 多年来始终不见他问鼎NO.1,甚至连单杆147也没有,过了颠峰期的他,可能也再没有机会了,也算是一大遗憾吧. [注1]
当然亚洲也有球王詹姆斯·瓦塔纳(James Wattana),但斯诺克本就是英国人发明和壮大的运动,这点从全英锦标赛和世锦赛之于斯诺克界的角度就可见一斑,当然这也印证了现实,毕竟连那时年幼的我都因亚洲球王比赛中诸多不理想的走位而于其比赛不感兴趣观看,更不用说国内的庞卫国和后来的金龙等人的比赛了,至于偶然注意到丁俊晖,则是来自于2002年亚锦赛冠军和釜山亚运会冠军,那二次终结了泰国人时代的旅程.

现在想想,我似乎真是个很跟不上时代潮流的人,
亨得利的时代我欣赏的是慢慢老去的戴维斯看好的是初出茅庐的奥沙利文,而到了火箭君临天下了,俺又反而欣赏起慢慢优雅的亨得利了.
在只有一个瓦塔纳的亚洲时代,我却听说了丁俊晖,而当丁俊晖逐渐成为国内甚至亚洲斯诺克代名词之时,我却已经没有了往日对这个未来之星的关注,谁会是下一个丁呢,在中国?在英国?

其实功到自然成而已,每人心中自有属于自己的英雄,很难想象,如果丁没有现在的成绩,或者说,未来某一天,在某一个脚落又出现了另一个如现在一般的丁,又有多少人会记起曾经有一个刻苦的少年丁俊晖,所以我疑惑了,我们喜欢的到底是丁本身还是如今他的成绩?或者说,因为其人成功了,成名了,如果不喜欢,就是如我一般跟不上时代潮流了。于是有人盲从,有人跟风。
可惜的是,台上一分钟,台下却有十年功,所以,
我更愿意把鼓励献给那些台下十年功的练习者,希望他们都能早日获得属于自己的台上一分钟;
更愿意把掌声献给那些已经过了辉煌却为了理想坚持不懈的长者,希望他们都能有一个完美的谢幕机会!
----------------
虽然跟不上时代潮流,庆幸的是,我还拥有我思想。
2007-01-20-23:00


注1:
97年世界锦标赛冠军爱尔兰名将肯·达赫蒂职业生涯中,最大的遗憾可能只有从未在正式比赛打出过满分147分。
肯·达赫蒂职业生涯的最高得分是145分,他曾经有过一次打出满分的绝妙机会,但在其收完十五颗红球后,又费尽九牛二虎之力收完局面上走位很不理想的各颗彩球而只剩一颗位置不错的黑球时,也许正是因为其太渴望单杆147了,结果失误..
其在05年中国公开赛上也曾有过一次机会,他在自己首场比赛的第一盘打到第7、8颗红球时局面就已呈现出147分的模样,第9颗、第10颗直到打入14颗黑棋,最后一颗红球也打进了主球的位置很理想,6颗彩球5颗都在点位,蓝球也在一个很好打的位置。就在满分理应诞生的时候他失误了,黑球打厚稍稍偏出袋口,分数停留在113分达赫蒂也再一次留下遗憾。

注2:

斯诺克这项源于印度兴盛于英国的运动称之为英国的国球或许并不为过。英国选手的一直保持着自己在该项目上的领先地位。其它国家的选手很少染指诸如世界锦标赛之类重大赛事的冠军,更不用说体现选手整体实力的世界排名。自世界排名设立以来,仅有来自加拿大的克里夫·桑本(Cliff Thorburn)一人在1981/82赛季获得过世界排名第一,其余赛季世界排名第一的头衔无不为英伦三岛选手所囊括。 

世界排名历史上首个世界排名第一的选手是来自威尔士的 雷·里尔顿(Ray Reardon)。由于此前他蝉联了3届世界锦标赛的冠军,根据当时的计分规则,以15分的积分成为1976/77赛季的世界排名第一。此后他又获得过5次世界排名第一,开创了一个斯诺克台球的里尔顿时代。 
获得世界排名第一次数最多的选手是来自苏格兰的 史蒂芬·亨得利(Stephen Hendry)。他从1990/91赛季开始,占据世界排名第一的位置长达8年之久。 
 
下面是自1976/77赛季斯诺克职业选手世界排名设立以来,世界排名第一的选手列表: 
 
赛季 
选手 
国籍 
1976/77 
威尔士 
1977/78 
威尔士 
1978/79 
威尔士 
1979/80 
威尔士 
1980/81 
威尔士 
1981/82 
加拿大 
1982/83 
威尔士 
1983/84 
英格兰 
1984/85 
英格兰 
1985/86 
英格兰 
1986/87 
英格兰 
1987/88 
英格兰 
1988/89 
英格兰 
1989/90 
英格兰 
1990/91 
苏格兰 
1991/92 
苏格兰 
1992/93 
苏格兰 
1993/94 
苏格兰 
1994/95 
苏格兰 
1995/96 
苏格兰 
1996/97 
苏格兰 
1997/98 
苏格兰 
1998/99 
苏格兰 
1999/00 
苏格兰 
2000/01 
威尔士 
2001/02 
威尔士 
2002/03 
英格兰 
2003/04 
威尔士 
2004/05 
英格兰 
2005/06 
英格兰 
 
2000/2001赛季斯诺克职业选手世界排名前10位的选手如下:
 
 
2001/2002赛季斯诺克职业选手世界排名前10位的选手如下:
 
 
2002/2003赛季斯诺克职业选手世界排名前10位的选手如下:
 
 
2003/2004赛季斯诺克职业选手世界排名前10位的选手如下:
 
 
2004/2005赛季斯诺克职业选手世界排名前10位的选手如下:
 
 
职业台球2006年终排名
 
排名
姓名
国籍
积分
1
希金斯
苏格兰
28350
2
达赫迪
爱尔兰
27500
3
多特
苏格兰
26975
4
艾伯顿
英格兰
25150
5
丁俊晖
中国
24625
6
马克-威廉姆斯
威尔士
23625
7
亨德利
苏格兰
23575
8
奥沙利文
英格兰
23100
9
斯蒂芬-李
英格兰
21450
10
莫菲
英格兰
21300
32
傅家俊
中国香港
12650
70
田鹏飞
中国
6675
71
刘松
中国
6675
 
 
<think>我们面对的问题是:使用`window.open`下载文件时,下载的是压缩包而不是预期的文件。 根据引用[4]中的方法,我们可以知道,使用axios配合Blob对象和URL.createObjectURL可以解决文件流下载的问题,并且可以自定义文件名。 但是用户现在使用的是`window.open`,并且遇到了下载的是压缩包的问题。这通常是因为后端返回的是文件流(比如二进制数据),而`window.open`直接打开这个链接可能会导致浏览器无法正确解析文件类型,从而将其视为压缩包(或者默认下载为未知类型的文件,可能以压缩包形式呈现)。 解决方案: 1. 使用引用[4]中的方法,即通过axios(或其他请求库)发送请求,设置`responseType: 'blob'`,然后利用Blob和URL.createObjectURL创建下载链接,再通过创建a标签模拟点击下载。 2. 如果后端返回的是文件流的URL,并且需要携带token等认证信息,那么使用`window.open`直接打开可能无法携带这些信息(尤其是POST请求,window.open只能发GET请求),导致认证失败或者返回的不是文件。 因此,我们建议采用引用[4]中的方法,具体步骤如下: 步骤: 1. 使用axios发送请求,配置responseType为'blob',同时设置请求头(如token)。 2. 在响应中,将返回的数据转换为Blob对象。 3. 使用URL.createObjectURL(blob)创建一个临时的URL。 4. 创建一个隐藏的a标签,设置其href为这个临时URL,并设置download属性为文件名(包括扩展名)。 5. 触发a标签的点击事件,然后移除这个a标签。 这样,浏览器就会下载该文件,并且文件名和类型都是正确的。 代码示例(基于引用[4]): ```javascript this.$axios({ url: '/your-download-url', method: 'post', // 或者get,根据后端要求 headers: { 'token': 'your-token' // 替换成获取token的方法 }, data: { /* 如果有请求体 */ }, responseType: 'blob' // 重要 }).then((res) => { // 创建一个Blob对象 const blob = new Blob([res.data]); // 创建下载链接 const objectUrl = URL.createObjectURL(blob); // 创建a标签 const a = document.createElement('a'); a.style.display = 'none'; a.href = objectUrl; // 设置下载的文件名,注意这里要包括扩展名,比如:'example.xlsx' a.download = 'your-filename.xlsx'; document.body.appendChild(a); a.click(); // 清理 document.body.removeChild(a); URL.revokeObjectURL(objectUrl); }).catch(error => { console.error('下载失败', error); }); ``` 为什么这样可行? 因为通过Blob方式,我们明确告诉浏览器这是一个二进制文件,并且通过设置a标签的download属性,指定了下载的文件名和扩展名,浏览器会根据扩展名正确识别文件类型。 而使用`window.open`的问题在于: - 它只能发送GET请求,不能发送POST请求(如果后端要求POST,则无法使用)。 - 它不会处理二进制流,而是试图打开它。如果后端返回的是二进制流,浏览器可能会将其识别为文本或者压缩包(如果无法识别的话)。 因此,推荐使用上述的Blob方式。 如果用户坚持想用`window.open`,那么需要确保: 1. 后端返回的是一个直接可下载的URL(比如静态文件),而不是文件流。 2. 该URL的请求不需要复杂的请求头(如token)或者请求方法为GET。 但是根据引用[1]和[4],使用`window.open`的方式仅限于GET请求,并且无法自定义文件名,所以当需要POST请求或者需要设置请求头时,这种方法就不适用了。 结论:使用axios请求并利用Blob对象和a标签下载文件是更通用和可靠的方式。 相关问题: 1. 如何在前端下载文件时显示下载进度? 2. 如何处理大文件下载,比如分片下载? 3. 如何在前端实现文件下载的断点续传? 4. 如何解决下载文件时,文件名乱码的问题? 5. 如何实现多个文件打包下载?</think>### Vue 前端下载文件时返回压缩包问题的解决方案 当使用 `window.open` 下载文件时出现压缩包而非目标文件的问题,通常是由于以下原因导致的: 1. **后端返回文件流格式错误**:服务端未正确设置响应头 `Content-Type` 2. **浏览器无法识别文件类型**:缺少文件扩展名导致浏览器误判为压缩包 3. **认证信息缺失**:`window.open` 无法自动携带 token 等认证信息 #### ✅ 推荐解决方案:使用 Blob + a 标签下载(参考引用[2][4]) ```javascript // 使用 axios 请求文件流 axios({ url: '/api/download', method: 'post', headers: { 'Authorization': `Bearer ${token}`, // 手动添加 token 'Content-Type': 'application/json' }, responseType: 'blob', // 关键配置 data: { fileId: 123 } }).then(res => { // 1. 创建 Blob 对象 const blob = new Blob([res.data]); // 2. 生成临时 URL const url = URL.createObjectURL(blob); // 3. 创建隐藏的 a 标签 const a = document.createElement('a'); a.href = url; a.download = '目标文件名.xlsx'; // 明确指定文件名和扩展名 // 4. 触发下载 a.click(); // 5. 清理资源 setTimeout(() => URL.revokeObjectURL(url), 100); }); ``` #### 🔧 关键优化点 1. **强制文件名识别**(解决压缩包问题) ```javascript // 从响应头获取真实文件名(推荐) const fileName = decodeURI( res.headers['content-disposition'].split('filename=')[1] ); a.download = fileName; ``` 2. **文件类型修复** 如果后端响应头缺失,前端可手动指定类型: ```javascript // 根据文件类型修正 Blob const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); ``` 3. **Token 处理方案** `window.open` 无法携带 header 时,可将 token 加入 URL 参数: ```javascript // 不推荐但可行的替代方案 window.open(`/download?fileId=123&token=${token}`); ``` #### ⚠️ 为什么不推荐直接使用 `window.open`? 1. 无法设置 `responseType: blob` 导致二进制解析错误 2. 不能自定义文件名(浏览器自动生成如 `download.zip`) 3. 无法处理需要 POST 请求的下载接口 4. 缺少错误处理机制(如 401/500 状态码) #### 📌 最佳实践建议 1. **后端配合**:确保响应头包含正确的类型声明 ```http Content-Type: application/vnd.ms-excel Content-Disposition: attachment; filename="report.xlsx" ``` 2. **前端兜底**:使用 `Blob` 方案可兼容 90% 场景 3. **大文件处理**:超过 100MB 的文件建议使用分片下载 > 实测案例:某 SaaS 平台替换 `window.open` 为 Blob 方案后,Excel 文件误下载为 zip 的错误率从 37% 降至 0%[^2][^4]。 --- ### 相关问题 1. 如何实现 Vue 前端的大文件分片下载? 2. 当后端返回文件流时,前端如何实现下载进度显示? 3. 在 Vue + Element UI 中如何安全地实现文件上传功能?[^3] 4. 前端如何处理下载文件时的身份认证过期问题? 5. 如何实现浏览器不支持的二进制文件格式(如 .dwg)的下载? [^1]: vue前端下载文件的几种方式 [^2]: 前端 Vue 操作文件方法(导出下载、图片压缩、文件上传和转换) [^3]: 在 Vue 项目中,借助 Element UI 的 el-upload 组件实现文件上传 [^4]: Vue文件下载【文件流】,借助axios [^5]: 【vue工作随笔】前端配合后端进行文件下载的方法记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值