在Java服务中有复杂网络环境下下载大文件的需求,一开始自己写了一个多线程下载,但遇到校园网下载1G以上大文件时直接卡死了。
经调研后决定用aria下载器,成熟稳定,避免自己去处理各种网络问题。下面记录一下windows和ubuntu系统上分别使用aria进行文件下载的步骤。
标题aria下载安装,打开jsonrpc
# ubuntu系统
sudo apt install -y aria2
aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D# windows系统
# 1. 下载aria2-1.36.0-win-64bit-build1.zip,https://github.com/aria2/aria2/releases
# 2. 解压文件
# 3. 执行命令:
aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D
保持aria在线的办法
写了一个监控脚本如下,放入crontab定时任务
log "aria heartbeat start"
result=$(curl -X GET --header 'Accept: application/json' 'http://localhost:6800/jsonrpc' | jq '.jsonrpc')
if [ "$result" == "" ]
thenlog "aria heartbeat failed"aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D
fi
Java 代码调用 jsonrpc
文件下载中遇到的一些需要注意的地方
- ubuntu 系统上 aria 会在未完成下载时就创建文件。
具体场景:例如指定url下载到一个1G的文件到 /home/user/test.zip。在任务创建后,/home/user/test.zip 就会被创建,且文件大小=1G。md5sum /home/user/test.zip 不等于正确值,且随着下载一直在变化。在某些情况下,这会造成干扰,让人或系统误以为文件已经下载完成,开始后续的操作,出现错误。
我的解决方案:给aria的指令改成创建 /home/user/test.zip.temp 甚至 /home/user/test.zip.uuid,完成后再把 /home/user/test.zip.temp 或 /home/user/test.zip.uuid 移动到 /home/user/test.zip
- 给 aria 发送多次相同的 url 和 filename的下载指令,
- 重复下载