当前位置: 首页 > news >正文

一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!

最近负责公司研究新的多渠道打包方案,之前的打包方案太慢了,因此采用了美团Android Signature V2 Scheme签名下的新一代渠道包打包神器 方案进行了多渠道打包。但是由于马虎,在配置多渠道打包定制渠道包的APK的文件名称的时候,在apk文件名称签名多敲了一个空格,因此出出现了FTP文件一直无法下载的悲剧,下面具体描述一下。

在Jenkins成功的时候多渠道包之后,会转移编译好的apk到FTP服务器,如下图所示,Jenkins第557次编译成功后的产物转移到FTP服务器之后,如下所示:

这里写图片描述

这个时候,用火狐浏览器去点击相应的apk进行下载可以正常下载下来,例如我们就下载XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk到桌面,如下所示:
这里写图片描述

链接为:

project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/%20XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

成功下载到桌面之后,如下所示:
这里写图片描述
特别注意上图中的文件名,发现在XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk字符串之前还有一个空格,之前我一直忽略了。

然后我提测给测试人员,测试人员没有安装火狐浏览器,使用的是Google Chrome浏览器,然后一直无法下载下来。我们自己用Google Chrome浏览器来复现一下,如下所示:
这里写图片描述

我们也下载XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk到桌面,点击链接,直接提示无法访问此网站,如下所示:
这里写图片描述

可以发现链接为:

/project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

对比一下之前的火狐浏览器的请求

FireFox 浏览器点击请求的链接
/project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/%20XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

Google Chrome浏览器点击请求的链接
/project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

这里写图片描述

我还不信邪了,我又去使用XFTP下载该apk,发现也是报错,如下图所示:
这里写图片描述

我又换了CuteFTP软件下载该apk,发现可以正常下载,如下图所示:
这里写图片描述

点击查看刚刚的下载任务属性,发现下载路径有空格符,如下图所示:
这里写图片描述

下面是XFTP和CuteFTP请求的链接对比

XTFP的请求链接
/project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

CuteFTP的请求链接
/project/Android/Common/App_Android_Trunk/2017-04-14-00-40-55-svn-19462-build-557/ XTCWatch_v3.6.0.App_Android_Trunk_557_imoo.apk

这里写图片描述

因此可以总结原因就是:

FireFox浏览器和CuteFTP保持FTP服务器上的文件原版路径不改变,因此可以正常下载下来。
而Google Chrome浏览器和XFTP软件,自作聪明的将FTP服务器上的文件的文件名中的空格符去掉了,导致下载请求链接时,链接并不存在,所以无法下载。

手贱,增加了空格符的groovy脚本语言如下所示:

walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = ' XTCWatch_'+'v${versionName}_${channel}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")

这里写图片描述

通过一段时间查找原因,终于找到了是因为文件名加了一个空格符导致无法下载的问题后,修复的groovy脚本语言如下所示:

walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = 'XTCWatch_'+'v${versionName}_${channel}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

这里写图片描述

提交代码,重新Jenkins编译之后,再次用Google Chrome浏览器和XFTP下载多渠道包apk,正常,如下所示:
这里写图片描述

点击链接下载的话,可以正常下载,如下所示:
这里写图片描述

使用XFTP也可以正常下载,如下所示:
这里写图片描述


这里写图片描述

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/70174497
如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。

这里写图片描述

转载于:https://www.cnblogs.com/ouyangpeng/p/8537655.html

相关文章:

  • node-glob通配符
  • Bzoj1005 [HNOI2008]明明的烦恼
  • 正则表达式 取反 非
  • Git学习与使用心得(1)—— 初始化
  • [转载]Monit:开源服务器监控工具
  • 运行第一个容器 - 每天5分钟玩转容器技术(4)
  • thrift实例:python实现
  • 微信开放平台手机APP支付
  • px PPI
  • fedora25输入法,中文输入法该用哪个——rime
  • 如何培养《未来架构师》(1)
  • 数字格式化工具:Numeral.js 简介
  • nginx防盗链和内核参数优化
  • 三列布局
  • ActFramework r1.2.0 带来的新特性
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angular 响应式表单 基础例子
  • fetch 从初识到应用
  • Git 使用集
  • JavaScript创建对象的四种方式
  • Java教程_软件开发基础
  • Netty 4.1 源代码学习:线程模型
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • RxJS: 简单入门
  • Shell编程
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 十年未变!安全,谁之责?(下)
  • 手写双向链表LinkedList的几个常用功能
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 通过git安装npm私有模块
  • 一文看透浏览器架构
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • #13 yum、编译安装与sed命令的使用
  • #NOIP 2014#Day.2 T3 解方程
  • (02)vite环境变量配置
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (层次遍历)104. 二叉树的最大深度
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (四)c52学习之旅-流水LED灯
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)memcache、redis缓存
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)甲方乙方——赵民谈找工作
  • (转)平衡树
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树