OnlineJudge icon indicating copy to clipboard operation
OnlineJudge copied to clipboard

增强上传测试样例时的功能,使通过压缩文件夹方式也可以成功上传

Open ayang818 opened this issue 5 years ago • 5 comments

1.目的

OJ在上传测试题目用例的时候只可以使用压缩文件的方式,但是对于常用的直接压缩文件夹的方式会提示Empty file,对于提高用户(不愿意看文档或看不懂文档)体验来说,不妨将两种上传方式都加入。

2.修复方式

为了向下兼容以及符合开闭原则,我只增加了 OnlineJudge/ problem / views / admin.py一个函数judge_dir,用于获得以压缩文件夹形式上传的文件目录——dir。这个函数对于spj为True或False都适用。我做了两种压缩文件夹的方式的测试

  1. 右键文件夹,点击发送到,选择发送为压缩(zipped)文件夹,这种压缩文件夹在python中用zipFile.listname()出来的列表格式如下
['testcase/1.in', 'testcase/1.out', 'testcase/2.in', 'testcase/2.out']
  1. 使用其他压缩软件压缩出的压缩文件夹,这种压缩文件夹在python中用zipFile.listname()出来的列表格式如下
['testcase/', 'testcase/1.in', 'testcase/1.out', 'testcase/2.in', 'testcase/2.out']

并且testcase/在列表中的位置似乎不固定。

以上这是我增加功能时碰到的坑。

3.修复过程

由于我不是专门写python的,本地没有Django的环境。所以我是每改一次代码就用容器部署到远端测试的。因此为了加速oj镜像的构建,我修改Dockerfile中的

RUN curl -L  $(curl -s  https://api.github.com/repos/QingdaoU/OnlineJudgeFE/releases/latest | grep /dist.zip | cut -d '"' -f 4) -o dist.zip && \
    unzip dist.zip && \
    rm dist.zip

RUN curl -L  https://opensoftware.oss-cn-hangzhou.aliyuncs.com/dist.zip -o dist.zip && \
    unzip dist.zip && \
    rm dist.zip

事实上我将OnlineJudgeFE项目的release的oj_2.6.1(当前最新)版本发布的dist文件,传到了阿里云上以加速镜像构建。然后打包了镜像发布到了我的阿里云镜像仓库,所以我也修改了OnlineJudgeDeploy项目中的docker-compose.yml,将oj-backend镜像换成我打包后的镜像,然后用docker-compose构建。

4.修复效果

对于2中提到的两种压缩文件夹方式均可正常工作,并且兼容原来的压缩文件方式。

5. 如何重现修复效果

为了下载方便,仓库放在Gitee上,PR将在Github上提

OnlineJudgeDeploy 按照README.md的步骤来部署就可以了

或者你可以直接访问测试网站,来检测效果,密码可以联系我。

ayang818 avatar Oct 17 '19 12:10 ayang818

貌似必要性不大?

william-song-shy avatar Oct 17 '19 13:10 william-song-shy

貌似必要性不大?

我一开始因为这个问题找了好久,感觉对于新用户来说体验会好一点。

ayang818 avatar Oct 18 '19 02:10 ayang818

@ayang818 你好,请教一下,为什么按照文档上的步骤压缩的zip包上传始终提示Empty file呢?昨天把项目克隆到本地,慢慢研究才定位到~/problem/views/admin.py(我不懂python)。研究了半天我看不懂问题所在。 以下是我的zip内容结构,如果可以,麻烦帮忙瞅瞅,十分感谢!~

% unzip -v testcase.zip

Archive:  testcase.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       4  Stored        4   0% 05-25-2020 17:12 55214233  testcase/1.in
       2  Stored        2   0% 05-25-2020 17:12 55679ed1  testcase/1.out
--------          -------  ---                            -------
       6                6   0%                            2 files

keepchen avatar May 26 '20 02:05 keepchen

@ayang818 你好,请教一下,为什么按照文档上的步骤压缩的zip包上传始终提示Empty file呢?昨天把项目克隆到本地,慢慢研究才定位到~/problem/views/admin.py(我不懂python)。研究了半天我看不懂问题所在。 以下是我的zip内容结构,如果可以,麻烦帮忙瞅瞅,十分感谢!~

% unzip -v testcase.zip

Archive:  testcase.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       4  Stored        4   0% 05-25-2020 17:12 55214233  testcase/1.in
       2  Stored        2   0% 05-25-2020 17:12 55679ed1  testcase/1.out
--------          -------  ---                            -------
       6                6   0%                            2 files

单单选择两个文件 1.out 2.out做压缩就行了。选择这两个文件所在的文件夹做压缩是会出现这个错误的。

ayang818 avatar May 26 '20 02:05 ayang818

@ayang818 你好,请教一下,为什么按照文档上的步骤压缩的zip包上传始终提示Empty file呢?昨天把项目克隆到本地,慢慢研究才定位到~/problem/views/admin.py(我不懂python)。研究了半天我看不懂问题所在。 以下是我的zip内容结构,如果可以,麻烦帮忙瞅瞅,十分感谢!~

% unzip -v testcase.zip

Archive:  testcase.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       4  Stored        4   0% 05-25-2020 17:12 55214233  testcase/1.in
       2  Stored        2   0% 05-25-2020 17:12 55679ed1  testcase/1.out
--------          -------  ---                            -------
       6                6   0%                            2 files

单单选择两个文件 1.out 2.out做压缩就行了。选择这两个文件所在的文件夹做压缩是会出现这个错误的。

感谢!正好在隔壁issue看到类似的。 #138

keepchen avatar May 26 '20 02:05 keepchen