feat(download): 支持分区存储Uri下载模式

This commit is contained in:
2026-07-27 01:38:57 +08:00
parent cb50a2dcd2
commit cef92d6a2f
25 changed files with 1037 additions and 54 deletions

View File

@@ -22,6 +22,7 @@ import com.arialyy.aria.core.loader.IRecordHandler;
import com.arialyy.aria.core.task.IThreadTaskAdapter;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.FileUtil;
import java.io.File;
final class FtpDTTBuilderAdapter extends AbsNormalTTBuilderAdapter {
@@ -31,6 +32,10 @@ final class FtpDTTBuilderAdapter extends AbsNormalTTBuilderAdapter {
}
@Override public boolean handleNewTask(TaskRecord record, int totalThreadNum) {
if (isUriMode()) {
// 分区存储Uri模式没有本地临时文件目标内容由ContentProvider管理无需清理
return true;
}
if (!record.isBlock) {
if (getTempFile().exists()) {
FileUtil.deleteFile(getTempFile());

View File

@@ -15,14 +15,15 @@
*/
package com.arialyy.aria.ftp.download;
import aria.apache.commons.net.ftp.FTPClient;
import aria.apache.commons.net.ftp.FTPReply;
import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.common.SubThreadConfig;
import com.arialyy.aria.exception.AriaFTPException;
import com.arialyy.aria.ftp.BaseFtpThreadTaskAdapter;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.BufferedRandomAccessFile;
import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.UriRandomAccessFile;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -31,6 +32,9 @@ import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import aria.apache.commons.net.ftp.FTPClient;
import aria.apache.commons.net.ftp.FTPReply;
/**
* @author lyy
* Date: 2019-09-18
@@ -82,6 +86,27 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
return;
}
if (getThreadConfig().tempUri != null) {
// 分区存储:通过 Uri 写入,支持断点续传
UriRandomAccessFile uriFile = null;
try {
uriFile = new UriRandomAccessFile(AriaConfig.getInstance().getAPP(),
getThreadConfig().tempUri, getThreadRecord().startLocation);
readNormal(is, uriFile);
handleComplete();
} catch (IOException e) {
fail(new AriaFTPException(
String.format("通过 Uri 下载失败【%s】", getThreadConfig().url), e), true);
} finally {
if (uriFile != null) {
try {
uriFile.close();
} catch (IOException ignored) {
}
}
}
return;
}
if (getThreadConfig().isBlock) {
readDynamicFile(is);
} else {
@@ -214,4 +239,29 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
}
}
}
/**
* 分区存储:通过 UriFileChannel写入数据支持断点续传
*/
private void readNormal(InputStream is, UriRandomAccessFile file) throws IOException {
byte[] buffer = new byte[getTaskConfig().getBuffSize()];
int len;
while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) {
if (getThreadTask().isBreak()) {
break;
}
if (mSpeedBandUtil != null) {
mSpeedBandUtil.limitNextBytes(len);
}
if (getThreadRecord().endLocation > 0
&& getRangeProgress() + len >= getThreadRecord().endLocation) {
len = (int) (getThreadRecord().endLocation - getRangeProgress());
file.write(buffer, 0, len);
progress(len);
break;
}
file.write(buffer, 0, len);
progress(len);
}
}
}