我在《Firefox Quantum 向左,Google Chrome 向右中,曾经吐槽过在 Firefox 中使用 Galaxy 上传本地的 Excel 文件时,会出现 xlsx 无法识别异常的问题。今天,我们来聊一聊原因。

背景

关于 Galaxy 生物信息平台,这里就不多说了,感兴趣的可以参考本专栏的前两篇文章。

  • Galaxy 生信平台(一):安装

  • Galaxy 生信平台(二):生产环境部署

对于数据上传,Galaxy 不仅可以支持 NCBI SRA、EBI SRA、UCSC main table browser 等数据库数据的无缝对接。


在本地文件的上传中,Galaxy 支持包括 ab1、arff、fasta、fastq、xlsx 在内 100 多种常见的格式数据上传。


对于不太熟悉命令行操作的科研工作者,Excel 是他们进行批量订单提交和处理最喜欢也是最熟悉的一个数据格式,因此,我们以 Galaxy 为基础开发一部分定制化工具中,有很大的一部分都是基于 excel 文件进行处理的工具。但随之而来的问题是,所有的这些工具在 Google Chrome 下可以运行良好,但是在 Firefox 下却出现了问题。


xlsx 文件上传

一开始,在办公环境下,我在内网环境部署的 Galaxy 和 https://usegalaxy.org/ 中分别对 xlsx 格式的文件进行上传测试,发现:

  • 在 Chrome 中两个 Galaxy 都能正常上传文件,没有任何错误。

  • 只有在 Firefox 中两个 Galaxy 才会出现如上截图的相同 Warning。

于是,下意识的,我开始怀疑,是不是 Firefox 会针对 Excel 的文件进行了特殊处理?还是 Galaxy 的 xlsx 文件识别存在 bug?针对前一个问题,我一开始并不知道如何去验证,但对于后一个问题,我开始了另外的尝试。

  • start_cgi_http_server.sh

#!/bin/bash

mkdir ./cgi-bin/cp upload.cgi ./cgi-bin/chmod +x ./cgi-bin/upload.cgimkdir ./upload/python -m http.server --cgi 8080
  • upload.cgi

#!/usr/bin/python# -*- coding: utf-8 -*-

import cgi, cgitb, os, sys

UPLOAD_DIR = './upload'

def save_uploaded_file():    print 'Content-Type: text/html; charset=UTF-8'    print    print '''<html><head>  <title>Upload File</title></head><body>'''

    form = cgi.FieldStorage()    if not form.has_key('file'):        print '<h1>Not found parameter: file</h1>'        return

    form_file = form['file']    if not form_file.file:        print '<h1>Not found parameter: file</h1>'        return

    if not form_file.filename:        print '<h1>Not found parameter: file</h1>'        return

    uploaded_file_path = os.path.join(UPLOAD_DIR, os.path.basename(form_file.filename))    with file(uploaded_file_path, 'wb') as fout:        while True:            chunk = form_file.file.read(100000)            if not chunk:                break            fout.write (chunk)    print '<h1>Completed file upload</h1>'

    print '''<hr><a href="../upload.html">Back to upload page</a></body></html>'''

cgitb.enable()save_uploaded_file()
  • upload.html

<html><head>  <title>Upload File</title></head><body>  <h1>Upload File</h1>  <form action="cgi-bin/upload.cgi" method="POST" enctype="multipart/form-data">    File: <input name="file" type="file">    <input name="submit" type="submit">  </form></body></html>

通过这三个程序,就可以在 Linux 下启动一个简单文件上传小网站。网站效果如下面的截图所示。

xlsx 文件识别

通过 python cgi 上传完文件后,在使用 python 模块进行处理的时,发现通过 Firefox 上传的文件开始出现问题了:

In [1]: import pandas as pdIn [2]: pd.read_excel("upload/upload.xlsx")---------------------------------------------------------------------------XLRDError                                 Traceback (most recent call last)<ipython-input-8-9e85b7330a4e> in <module>----> 1 pd.read_excel("upload/upload.xlsx")

......

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'b\x14#e\xa9\x01W\x00'

于是,开始回去看 Galaxy 的源码,想要搞明白 Galaxy 对于 xlsx 文件上传到底是怎么进行识别的,终于在 packages/data/galaxy/datatypes/binary.py 中发现 Galaxy 正是使用了 python 的 zipfile 模块 :


于是,我也开始使用  zipfile 来对先前 python cgi 上传的文件进行测试:

In [9]: import zipfile

In [10]: zipfile.ZipFile("upload/upload.xlsx")---------------------------------------------------------------------------BadZipFile                                Traceback (most recent call last)<ipython-input-10-3793f2363956> in <module>----> 1 zipfile.ZipFile("upload/upload.xlsx")

......

BadZipFile: File is not a zip file

同样的操作,我在 Chrome 重复了一遍,但是却神奇的发现,不管是 panda 还是 zipfile 模块,竟然一切都表现正常!似乎,Firefox 的确有点不正常。

真正原因

针对这个问题,我最开始向 Galaxy Project 团队咨询过,但一直没有从根本解决掉这个问题,他们建议考虑非 xlsx 格式数据的工具开发。


直到前几天,突发奇想在 Firefox 社区中重新提起这个事情,一个热心网友的回复才让我意识到了问题的所在,也就是哈希——文件完整性校验。


我把文件上传前的 MD5 和文件上传后的 MD5 重新进行了计算比较,这才发现:

  • 使用 Firefox 上传前后文件的 MD5 是一致,Python 却不能识别为有效的 zip 文件;

  • 使用 Chrome 上传的文件前后 MD5 是不一致的,Python 却能正常识别为有效的 zip 文件。

很明显,我的原始 xlsx 文件是有问题的!!吐血中!!!但是在办公环境中,这个原始的 xlsx 文件不管是 Office 2016 还是 WPS 都能正常打开,正常编辑保存。唯一不同的是文件中多了一个锁的标志。


其实,这就是企业企业办公文档 Office Excel 软件加密的一种效果。

  1. 安装加密软件:安装加密服务端和管理端,客户端安装在被加密的电脑中;

  2. 设置加密策略:打开管理端,选择文件加密—加密策略,勾选需要加密的 office Excel,然后保存策略,如下图;重启被加密员工电脑。


测试加密效果:被加密电脑重启后,打开 word 文档,新建文档并编辑保存,保存后的文件会显示“加锁”标志,如下图示,显示已成功加密。


实现效果:员工编辑后的文档自动加密,加密后的文档未经许可,私自通过 QQ,电子邮件,U盘等任何方式传输到公司以外,都将无法打开使用;不改变编辑操作习惯,在企业内部相互流通编辑,不受影响。彻底从源头保障数据的安全性。此外还可实现如需外发文件,可通过申请解密流程授权解密后方可外发;同时还可对其他软件进行加密,比如办公软件,设计软件,工程软件,编程软件,研发软件等。

最后,把未加密的 xlsx 文件进行重新测试,一切问题迎刃而解。

总结一下

这是一个企业文档加密引发的填坑记录,从问题的发现,问题的思考,到解决的思路值得探讨记录一下。

  • MD5,MD5,MD5,重要的事情要说三遍!!!

  • 学习源码,Galaxy Project 的源码挺有意思的,不妨一读。

  • Python CGI 的一些简单应用,也挺好玩。

  • 多多交流,学会搜索,善用资源,事半功倍。

Chrome 为什么能绕开部分企业文档加密的枷锁,还原文件,这是一个有待后面学习的问题,mark 一下,同时期待大家指点迷津。

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Galaxy 生信平台(三):xlsx 上传与识别相关推荐

  1. Galaxy 生信平台(四):邮件与管理员配置

    前几天看到中山大学和国家基因库合作开发的 Translatome Workbench 翻译组学可视化在线数据分析平台 (db.cngb.org/galaxy/) 的推送信息,也上去看了一下,工具和教程 ...

  2. Galaxy 生信平台(二):生产环境部署

    在 上一篇文章中,我们介绍了适合单个用户进行使用和开发的 Galaxy 在线平台,今天我们来聊一下在为多用户生产环境设置 Galaxy 时,我们应采取的一些可以让 Galaxy 获得最佳性能的额外步骤 ...

  3. Galaxy 生信平台(一):安装

    Galaxy Project( https://galaxyproject.org/)是在云计算背景下诞生的一个生物信息学可视化分析开源项目. 该项目由美国国家科学基金会(NSF).美国国家人类基因组 ...

  4. galaxy 生信安装软件_如何在三星Galaxy Smartwatches上安装Google Assistant

    galaxy 生信安装软件 Samsung 三星 Samsung Galaxy smartwatches are a great option for people with Android phon ...

  5. 解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题...

    解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题 官方上传命令 curl -F file=@"315.apk" -F uKey=XXX ...

  6. 菜鸟教程php 文件上传,php入门学习知识点三 PHP上传

    if(is_uploaded_file($_FILES["Imgs"]["tmp_name"])){ $phpupfile=$_FILES["Imgs ...

  7. cpan安装_生信平台搭建(五):安装perl模块

    perl模块也是生物信息分析中经常需要配置的东西,尽管很多人觉得python很流行,但是依然有大量的生物软件依赖于perl模块,如果配置不正确就无法运行,典型的就是circos,里面调用大量perl的 ...

  8. web平台安装程序_Galaxy 生信平台(一):安装

    Galaxy Project(https://galaxyproject.org/)是在云计算背景下诞生的一个生物信息学可视化分析开源项目. 该项目由美国国家科学基金会(NSF).美国国家人类基因组研 ...

  9. flask中使用FileField上传文件的两种方式+前端页面上传文件(flask三种上传文件方式)

    文章目录 上传文件方式一: 1.index.html文件: 2.主文件main.py: 上传文件方式二: 1.index2.html文件: 2.main.py文件: 上传文件方式三: 1.index3 ...

最新文章

  1. 精品德国软件 UltraShredder 文件粉碎机
  2. 二、配置QtDesigner、PyUIC及PyRcc
  3. Python爬虫开发:requests库的使用--session的使用
  4. 常见操作系统调度算法研究(2)
  5. html5执行shell,利用nginx执行Shell 脚本
  6. 远程下层文档 正在打印_长宁打印机随叫随到,送货上门
  7. kafka consumer group 定义
  8. matlab中subplot()函数的作用
  9. linux6.5输错密码锁定,干货分享:解决redhat6.5登陆后跳回Login,循环登陆问题
  10. matlab gui设置参数,基于Matlab/GUI界面设计的参数在线整定与优化(三)
  11. 中医药天池大数据竞赛——中医文献问题生成挑战(三)
  12. 技术岗的职业规划_银行信息技术岗职业规划范文
  13. java课程设计 考试系统,java课程设计考试系统.
  14. 电脑屏幕保护推荐——Fliqlo
  15. 工频风力发电储能逆变电路中的电流检测(霍尔电流传感器ACS712/CH701应用案例)
  16. Python利用Opencv读取图片
  17. 减去“商品名”这层包装外衣,让你看清“药品名”的真谛 - 看看你的感冒在中西医各怎样解读与配药
  18. 2015年c语言等级考试题1 10 2分,全国计算机等级考试二级c语言真题题库1+2015年9月.docx...
  19. 21Winter\ C语言程序设计第六章
  20. python技术线上培训

热门文章

  1. 【腾讯三面】你能现场写一下LRU算法吗?
  2. 从谷歌辞职后,作为独立开发者的第三年,我从年入 3 万做到了年入 40 万
  3. 再见了Redis!这个数据库有点厉害,甚至碾压了Oracle!
  4. 如何让你的Nginx 提升10倍性能?
  5. 为什么顶尖高手,都是长期主义者?
  6. 图解YARN--大数据平台技术栈17
  7. 2019学习Python的10个原因
  8. OKR的火爆,正是基于这些价值
  9. @卡尔曼滤波 跑通调参
  10. 什么是SQL数据库?