修复无法自动识别含有账号的ftpurl地址 https://github.com/AriaLyy/Aria/issues/146
This commit is contained in:
@@ -23,8 +23,8 @@ dependencies {
|
|||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
compile 'com.android.support:appcompat-v7:23.1.1'
|
compile 'com.android.support:appcompat-v7:23.1.1'
|
||||||
compile project(':AriaAnnotations')
|
compile project(':AriaAnnotations')
|
||||||
compile 'com.arialyy.aria:aria-ftp-plug:1.0.3'
|
// compile 'com.arialyy.aria:aria-ftp-plug:1.0.3'
|
||||||
|
|
||||||
// compile project(':AriaFtpPlug')
|
compile project(':AriaFtpPlug')
|
||||||
}
|
}
|
||||||
apply from: 'bintray-release.gradle'
|
apply from: 'bintray-release.gradle'
|
||||||
|
53
Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java
Normal file
53
Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package com.arialyy.aria.core;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Aria.Lao on 2017/10/24.
|
||||||
|
* ftp url 信息链接实体
|
||||||
|
*/
|
||||||
|
public class FtpUrlEntity {
|
||||||
|
|
||||||
|
public String remotePath;
|
||||||
|
|
||||||
|
public String account;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 原始url
|
||||||
|
*/
|
||||||
|
public String url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ftp协议
|
||||||
|
*/
|
||||||
|
public String protocol;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户
|
||||||
|
*/
|
||||||
|
public String user;
|
||||||
|
/**
|
||||||
|
* 密码
|
||||||
|
*/
|
||||||
|
public String password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 端口
|
||||||
|
*/
|
||||||
|
public String port;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主机域名
|
||||||
|
*/
|
||||||
|
public String hostName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否需要登录
|
||||||
|
*/
|
||||||
|
public boolean needLogin = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有效的ip地址
|
||||||
|
*/
|
||||||
|
public InetAddress validAddr;
|
||||||
|
}
|
@@ -18,12 +18,15 @@ package com.arialyy.aria.core.common;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.arialyy.aria.core.AriaManager;
|
import com.arialyy.aria.core.AriaManager;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
|
||||||
import com.arialyy.aria.core.inf.AbsEntity;
|
import com.arialyy.aria.core.inf.AbsEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
|
import com.arialyy.aria.util.Regular;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import org.apache.commons.net.ftp.FTP;
|
import org.apache.commons.net.ftp.FTP;
|
||||||
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPClient;
|
||||||
import org.apache.commons.net.ftp.FTPFile;
|
import org.apache.commons.net.ftp.FTPFile;
|
||||||
@@ -42,7 +45,6 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
private int mConnectTimeOut;
|
private int mConnectTimeOut;
|
||||||
protected OnFileInfoCallback mCallback;
|
protected OnFileInfoCallback mCallback;
|
||||||
protected long mSize = 0;
|
protected long mSize = 0;
|
||||||
protected String mServerIp, mPort;
|
|
||||||
protected String charSet = "UTF-8";
|
protected String charSet = "UTF-8";
|
||||||
private boolean isUpload = false;
|
private boolean isUpload = false;
|
||||||
|
|
||||||
@@ -71,7 +73,18 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
if (client == null) return;
|
if (client == null) return;
|
||||||
String remotePath =
|
String remotePath =
|
||||||
new String(setRemotePath().getBytes(charSet), AbsFtpThreadTask.SERVER_CHARSET);
|
new String(setRemotePath().getBytes(charSet), AbsFtpThreadTask.SERVER_CHARSET);
|
||||||
|
FTPFile[] files_1 = client.listFiles();
|
||||||
|
for (FTPFile tf : files_1) {
|
||||||
|
|
||||||
|
Log.d(TAG, tf.getName());
|
||||||
|
}
|
||||||
FTPFile[] files = client.listFiles(remotePath);
|
FTPFile[] files = client.listFiles(remotePath);
|
||||||
|
boolean isExist = files.length != 0;
|
||||||
|
if (!isExist && !isUpload) {
|
||||||
|
client.disconnect();
|
||||||
|
failDownload("文件不存在,任务链接【" + mTaskEntity.urlEntity.url + "】", false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
mSize = getFileSize(files, client, remotePath);
|
mSize = getFileSize(files, client, remotePath);
|
||||||
int reply = client.getReplyCode();
|
int reply = client.getReplyCode();
|
||||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||||
@@ -80,7 +93,7 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
mTaskEntity.isNewTask = true;
|
mTaskEntity.isNewTask = true;
|
||||||
} else {
|
} else {
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
failDownload("获取文件信息错误,错误码为:" + reply);
|
failDownload("获取文件信息错误,错误码为:" + reply, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -91,7 +104,7 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
onPreComplete(reply);
|
onPreComplete(reply);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
failDownload(e.getMessage());
|
failDownload(e.getMessage(), true);
|
||||||
} finally {
|
} finally {
|
||||||
if (client != null) {
|
if (client != null) {
|
||||||
try {
|
try {
|
||||||
@@ -103,6 +116,20 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查文件是否存在
|
||||||
|
*
|
||||||
|
* @return {@code true}存在
|
||||||
|
*/
|
||||||
|
private boolean checkFileExist(FTPFile[] ftpFiles, String fileName) {
|
||||||
|
for (FTPFile ff : ftpFiles){
|
||||||
|
if (ff.getName().equals(fileName)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
new Thread(this).start();
|
new Thread(this).start();
|
||||||
}
|
}
|
||||||
@@ -114,40 +141,52 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
/**
|
/**
|
||||||
* 创建FTP客户端
|
* 创建FTP客户端
|
||||||
*/
|
*/
|
||||||
private FTPClient createFtpClient() throws IOException {
|
private FTPClient createFtpClient() {
|
||||||
String url = "";
|
FTPClient client = null;
|
||||||
if (mEntity instanceof DownloadEntity) {
|
final FtpUrlEntity urlEntity = mTaskEntity.urlEntity;
|
||||||
url = ((DownloadEntity) mEntity).getUrl();
|
try {
|
||||||
} else if (mEntity instanceof UploadEntity) {
|
Pattern p = Pattern.compile(Regular.REG_IP_V4);
|
||||||
url = ((UploadEntity) mEntity).getUrl();
|
Matcher m = p.matcher(urlEntity.hostName);
|
||||||
} else if (mEntity instanceof DownloadGroupEntity) {
|
if (m.find() && m.groupCount() > 0) {
|
||||||
url = mEntity.getKey();
|
client = new FTPClient();
|
||||||
|
InetAddress ip = InetAddress.getByName(urlEntity.hostName);
|
||||||
|
client.connect(ip, Integer.parseInt(urlEntity.port));
|
||||||
|
mTaskEntity.urlEntity.validAddr = ip;
|
||||||
} else {
|
} else {
|
||||||
failDownload("未知实体");
|
InetAddress[] ips = InetAddress.getAllByName(urlEntity.hostName);
|
||||||
Log.e(TAG, "未知实体");
|
client = connect(new FTPClient(), ips, 0, Integer.parseInt(urlEntity.port));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client == null) {
|
||||||
|
failDownload("链接失败", false);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String[] pp = url.split("/")[2].split(":");
|
|
||||||
mServerIp = pp[0];
|
boolean loginSuccess = true;
|
||||||
mPort = pp[1];
|
if (urlEntity.needLogin) {
|
||||||
FTPClient client = new FTPClient();
|
if (TextUtils.isEmpty(urlEntity.account)) {
|
||||||
// 连接服务器
|
loginSuccess = client.login(urlEntity.user, urlEntity.password);
|
||||||
client.connect(mServerIp, Integer.parseInt(mPort));
|
|
||||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
|
||||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
|
||||||
} else {
|
} else {
|
||||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
loginSuccess = client.login(urlEntity.user, urlEntity.password, urlEntity.account);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!loginSuccess) {
|
||||||
|
failDownload("登录失败", false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
int reply = client.getReplyCode();
|
int reply = client.getReplyCode();
|
||||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
failDownload("无法连接到ftp服务器,错误码为:" + reply);
|
failDownload("无法连接到ftp服务器,错误码为:" + reply, true);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||||
charSet = "UTF-8";
|
charSet = "UTF-8";
|
||||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||||
|
Log.d(TAG, "FTP 服务器不支持开启UTF8编码,尝试使用Aria手动设置的编码");
|
||||||
charSet = mTaskEntity.charSet;
|
charSet = mTaskEntity.charSet;
|
||||||
}
|
}
|
||||||
client.setControlEncoding(charSet);
|
client.setControlEncoding(charSet);
|
||||||
@@ -155,9 +194,36 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
client.enterLocalPassiveMode();
|
client.enterLocalPassiveMode();
|
||||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||||
client.setControlKeepAliveTimeout(5);
|
client.setControlKeepAliveTimeout(5);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接到ftp服务器
|
||||||
|
*/
|
||||||
|
private FTPClient connect(FTPClient client, InetAddress[] ips, int index, int port) {
|
||||||
|
try {
|
||||||
|
client.connect(ips[index], port);
|
||||||
|
mTaskEntity.urlEntity.validAddr = ips[index];
|
||||||
|
return client;
|
||||||
|
} catch (IOException e) {
|
||||||
|
//e.printStackTrace();
|
||||||
|
if (index + 1 >= ips.length) {
|
||||||
|
Log.e(TAG, "遇到[ECONNREFUSED-连接被服务器拒绝]错误,已没有其他地址,链接失败");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
Log.e(TAG, "遇到[ECONNREFUSED-连接被服务器拒绝]错误,正在尝试下一个地址");
|
||||||
|
return connect(new FTPClient(), ips, index + 1, port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 遍历FTP服务器上对应文件或文件夹大小
|
* 遍历FTP服务器上对应文件或文件夹大小
|
||||||
*
|
*
|
||||||
@@ -188,10 +254,10 @@ public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY ext
|
|||||||
protected void handleFile(String remotePath, FTPFile ftpFile) {
|
protected void handleFile(String remotePath, FTPFile ftpFile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void failDownload(String errorMsg) {
|
private void failDownload(String errorMsg, boolean needRetry) {
|
||||||
Log.e(TAG, errorMsg);
|
Log.e(TAG, errorMsg);
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onFail(mEntity.getKey(), errorMsg);
|
mCallback.onFail(mEntity.getKey(), errorMsg, needRetry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,9 +16,11 @@
|
|||||||
package com.arialyy.aria.core.common;
|
package com.arialyy.aria.core.common;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsNormalEntity;
|
import com.arialyy.aria.core.inf.AbsNormalEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.core.inf.IEventListener;
|
import com.arialyy.aria.core.inf.IEventListener;
|
||||||
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import org.apache.commons.net.ftp.FTP;
|
import org.apache.commons.net.ftp.FTP;
|
||||||
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPClient;
|
||||||
@@ -45,18 +47,18 @@ public abstract class AbsFtpThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTI
|
|||||||
* 构建FTP客户端
|
* 构建FTP客户端
|
||||||
*/
|
*/
|
||||||
protected FTPClient createClient() throws IOException {
|
protected FTPClient createClient() throws IOException {
|
||||||
String url = mEntity.getUrl();
|
|
||||||
String[] pp = url.split("/")[2].split(":");
|
|
||||||
serverIp = pp[0];
|
|
||||||
port = pp[1];
|
|
||||||
FTPClient client = new FTPClient();
|
FTPClient client = new FTPClient();
|
||||||
// 连接服务器
|
final FtpUrlEntity urlEntity = mTaskEntity.urlEntity;
|
||||||
client.connect(serverIp, Integer.parseInt(port));
|
client.connect(urlEntity.validAddr, Integer.parseInt(urlEntity.port));
|
||||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
|
||||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
if (urlEntity.needLogin) {
|
||||||
|
if (TextUtils.isEmpty(urlEntity.account)) {
|
||||||
|
client.login(urlEntity.user, urlEntity.password);
|
||||||
} else {
|
} else {
|
||||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
client.login(urlEntity.user, urlEntity.password, urlEntity.account);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int reply = client.getReplyCode();
|
int reply = client.getReplyCode();
|
||||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
@@ -70,12 +72,10 @@ public abstract class AbsFtpThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTI
|
|||||||
charSet = mTaskEntity.charSet;
|
charSet = mTaskEntity.charSet;
|
||||||
}
|
}
|
||||||
client.setControlEncoding(charSet);
|
client.setControlEncoding(charSet);
|
||||||
client.setDataTimeout(STATE.READ_TIME_OUT);
|
client.setDataTimeout(10 * 1000);
|
||||||
client.enterLocalPassiveMode();
|
client.enterLocalPassiveMode();
|
||||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||||
client.setBufferSize(mBufSize);
|
|
||||||
client.setControlKeepAliveTimeout(5);
|
client.setControlKeepAliveTimeout(5);
|
||||||
//client.setCopyStreamListener();
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,5 +13,5 @@ public interface OnFileInfoCallback {
|
|||||||
*
|
*
|
||||||
* @param errorMsg 错误信息
|
* @param errorMsg 错误信息
|
||||||
*/
|
*/
|
||||||
void onFail(String url, String errorMsg);
|
void onFail(String url, String errorMsg, boolean needRetry);
|
||||||
}
|
}
|
@@ -19,6 +19,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.orm.DbEntity;
|
import com.arialyy.aria.orm.DbEntity;
|
||||||
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Aria.Lao on 2017/7/26.
|
* Created by Aria.Lao on 2017/7/26.
|
||||||
@@ -27,22 +28,12 @@ import com.arialyy.aria.orm.DbEntity;
|
|||||||
public class FtpDirDownloadTarget
|
public class FtpDirDownloadTarget
|
||||||
extends BaseGroupTarget<FtpDirDownloadTarget, DownloadGroupTaskEntity> {
|
extends BaseGroupTarget<FtpDirDownloadTarget, DownloadGroupTaskEntity> {
|
||||||
private final String TAG = "FtpDirDownloadTarget";
|
private final String TAG = "FtpDirDownloadTarget";
|
||||||
private String serverIp, remotePath;
|
|
||||||
private int port;
|
|
||||||
|
|
||||||
FtpDirDownloadTarget(String url, String targetName) {
|
FtpDirDownloadTarget(String url, String targetName) {
|
||||||
init(url);
|
init(url);
|
||||||
String[] pp = url.split("/")[2].split(":");
|
|
||||||
mTargetName = targetName;
|
mTargetName = targetName;
|
||||||
serverIp = pp[0];
|
mTaskEntity.urlEntity = CommonUtil.getFtpUrlInfo(url);
|
||||||
port = Integer.parseInt(pp[1]);
|
|
||||||
mTaskEntity.requestType = AbsTaskEntity.FTP_DIR;
|
mTaskEntity.requestType = AbsTaskEntity.FTP_DIR;
|
||||||
mTaskEntity.serverIp = serverIp;
|
|
||||||
mTaskEntity.port = port;
|
|
||||||
remotePath = url.substring(url.indexOf(pp[1]) + pp[1].length(), url.length());
|
|
||||||
if (TextUtils.isEmpty(remotePath)) {
|
|
||||||
throw new NullPointerException("ftp服务器地址不能为null");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init(String key) {
|
private void init(String key) {
|
||||||
@@ -92,9 +83,10 @@ public class FtpDirDownloadTarget
|
|||||||
Log.e(TAG, "密码不能为null");
|
Log.e(TAG, "密码不能为null");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
mTaskEntity.userName = userName;
|
mTaskEntity.urlEntity.needLogin = true;
|
||||||
mTaskEntity.userPw = password;
|
mTaskEntity.urlEntity.user = userName;
|
||||||
mTaskEntity.account = account;
|
mTaskEntity.urlEntity.password = password;
|
||||||
|
mTaskEntity.urlEntity.account = account;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,8 +28,6 @@ import java.io.File;
|
|||||||
*/
|
*/
|
||||||
public class FtpDownloadTarget extends DownloadTarget {
|
public class FtpDownloadTarget extends DownloadTarget {
|
||||||
private final String TAG = "FtpDownloadTarget";
|
private final String TAG = "FtpDownloadTarget";
|
||||||
private String serverIp, remotePath;
|
|
||||||
private int port;
|
|
||||||
|
|
||||||
FtpDownloadTarget(String url, String targetName) {
|
FtpDownloadTarget(String url, String targetName) {
|
||||||
this(url, targetName, false);
|
this(url, targetName, false);
|
||||||
@@ -37,19 +35,11 @@ public class FtpDownloadTarget extends DownloadTarget {
|
|||||||
|
|
||||||
FtpDownloadTarget(String url, String targetName, boolean refreshInfo) {
|
FtpDownloadTarget(String url, String targetName, boolean refreshInfo) {
|
||||||
super(url, targetName);
|
super(url, targetName);
|
||||||
String[] pp = url.split("/")[2].split(":");
|
|
||||||
this.serverIp = pp[0];
|
|
||||||
this.port = Integer.parseInt(pp[1]);
|
|
||||||
mTaskEntity.requestType = AbsTaskEntity.FTP;
|
|
||||||
remotePath = url.substring(url.indexOf(pp[1]) + pp[1].length(), url.length());
|
|
||||||
if (TextUtils.isEmpty(remotePath)) {
|
|
||||||
throw new NullPointerException("ftp服务器地址不能为null");
|
|
||||||
}
|
|
||||||
int lastIndex = url.lastIndexOf("/");
|
int lastIndex = url.lastIndexOf("/");
|
||||||
mTaskEntity.serverIp = serverIp;
|
|
||||||
mTaskEntity.port = port;
|
|
||||||
mEntity.setFileName(url.substring(lastIndex + 1, url.length()));
|
mEntity.setFileName(url.substring(lastIndex + 1, url.length()));
|
||||||
|
mTaskEntity.urlEntity = CommonUtil.getFtpUrlInfo(url);
|
||||||
mTaskEntity.refreshInfo = refreshInfo;
|
mTaskEntity.refreshInfo = refreshInfo;
|
||||||
|
mTaskEntity.requestType = AbsTaskEntity.FTP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -116,9 +106,10 @@ public class FtpDownloadTarget extends DownloadTarget {
|
|||||||
Log.e(TAG, "密码不能为null");
|
Log.e(TAG, "密码不能为null");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
mTaskEntity.userName = userName;
|
mTaskEntity.urlEntity.needLogin = true;
|
||||||
mTaskEntity.userPw = password;
|
mTaskEntity.urlEntity.user = userName;
|
||||||
mTaskEntity.account = account;
|
mTaskEntity.urlEntity.password = password;
|
||||||
|
mTaskEntity.urlEntity.account = account;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -387,9 +387,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
if (taskEntity != null) {
|
if (taskEntity != null) {
|
||||||
taskEntity.entity = entity;
|
taskEntity.entity = entity;
|
||||||
//ftp登录的
|
//ftp登录的
|
||||||
taskEntity.userName = mTaskEntity.userName;
|
taskEntity.urlEntity = mTaskEntity.urlEntity;
|
||||||
taskEntity.userPw = mTaskEntity.userPw;
|
|
||||||
taskEntity.account = mTaskEntity.account;
|
|
||||||
mTasksMap.put(entity.getUrl(), taskEntity);
|
mTasksMap.put(entity.getUrl(), taskEntity);
|
||||||
return taskEntity;
|
return taskEntity;
|
||||||
}
|
}
|
||||||
@@ -403,9 +401,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
|||||||
taskEntity.isGroupTask = true;
|
taskEntity.isGroupTask = true;
|
||||||
taskEntity.requestType = mTaskEntity.requestType;
|
taskEntity.requestType = mTaskEntity.requestType;
|
||||||
//ftp登录的
|
//ftp登录的
|
||||||
taskEntity.userName = mTaskEntity.userName;
|
taskEntity.urlEntity = mTaskEntity.urlEntity;
|
||||||
taskEntity.userPw = mTaskEntity.userPw;
|
|
||||||
taskEntity.account = mTaskEntity.account;
|
|
||||||
taskEntity.key = entity.getDownloadPath();
|
taskEntity.key = entity.getDownloadPath();
|
||||||
taskEntity.save();
|
taskEntity.save();
|
||||||
mTasksMap.put(entity.getUrl(), taskEntity);
|
mTasksMap.put(entity.getUrl(), taskEntity);
|
||||||
|
@@ -105,7 +105,7 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(String url, String errorMsg) {
|
@Override public void onFail(String url, String errorMsg, boolean needRetry) {
|
||||||
DownloadTaskEntity te = mExeMap.get(url);
|
DownloadTaskEntity te = mExeMap.get(url);
|
||||||
if (te != null) {
|
if (te != null) {
|
||||||
mFailMap.put(url, te);
|
mFailMap.put(url, te);
|
||||||
|
@@ -49,8 +49,8 @@ public class FtpDirDownloadUtil extends AbsGroupUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(String url, String errorMsg) {
|
@Override public void onFail(String url, String errorMsg, boolean needRetry) {
|
||||||
mListener.onFail(true);
|
mListener.onFail(needRetry);
|
||||||
ErrorHelp.saveError("FTP_DIR", mTaskEntity.getEntity(), "", errorMsg);
|
ErrorHelp.saveError("FTP_DIR", mTaskEntity.getEntity(), "", errorMsg);
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
|
@@ -37,7 +37,7 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro
|
|||||||
|
|
||||||
@Override protected String setRemotePath() {
|
@Override protected String setRemotePath() {
|
||||||
String url = mEntity.getKey();
|
String url = mEntity.getKey();
|
||||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length());
|
return mTaskEntity.urlEntity.remotePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void handleFile(String remotePath, FTPFile ftpFile) {
|
@Override protected void handleFile(String remotePath, FTPFile ftpFile) {
|
||||||
@@ -53,7 +53,7 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro
|
|||||||
|
|
||||||
private void addEntity(String remotePath, FTPFile ftpFile) {
|
private void addEntity(String remotePath, FTPFile ftpFile) {
|
||||||
DownloadEntity entity = new DownloadEntity();
|
DownloadEntity entity = new DownloadEntity();
|
||||||
entity.setUrl("ftp://" + mTaskEntity.serverIp + ":" + mTaskEntity.port + remotePath);
|
entity.setUrl(mTaskEntity.urlEntity.url);
|
||||||
entity.setDownloadPath(mEntity.getDirPath() + "/" + remotePath);
|
entity.setDownloadPath(mEntity.getDirPath() + "/" + remotePath);
|
||||||
int lastIndex = remotePath.lastIndexOf("/");
|
int lastIndex = remotePath.lastIndexOf("/");
|
||||||
String fileName = lastIndex < 0 ? CommonUtil.keyToHashKey(remotePath)
|
String fileName = lastIndex < 0 ? CommonUtil.keyToHashKey(remotePath)
|
||||||
|
@@ -31,8 +31,7 @@ class FtpFileInfoThread extends AbsFtpInfoThread<DownloadEntity, DownloadTaskEnt
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override protected String setRemotePath() {
|
@Override protected String setRemotePath() {
|
||||||
String url = mEntity.getUrl();
|
return mTaskEntity.urlEntity.remotePath;
|
||||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void onPreComplete(int code) {
|
@Override protected void onPreComplete(int code) {
|
||||||
|
@@ -57,11 +57,9 @@ class FtpThreadTask extends AbsFtpThreadTask<DownloadEntity, DownloadTaskEntity>
|
|||||||
+ "】");
|
+ "】");
|
||||||
client = createClient();
|
client = createClient();
|
||||||
if (client == null) return;
|
if (client == null) return;
|
||||||
String url = mEntity.getUrl();
|
|
||||||
String remotePath = new String(
|
|
||||||
url.substring(url.indexOf(port) + port.length(), url.length()).getBytes(charSet),
|
|
||||||
SERVER_CHARSET);
|
|
||||||
client.setRestartOffset(mConfig.START_LOCATION);
|
client.setRestartOffset(mConfig.START_LOCATION);
|
||||||
|
String remotePath =
|
||||||
|
new String(mTaskEntity.urlEntity.remotePath.getBytes(charSet), SERVER_CHARSET);
|
||||||
is = client.retrieveFileStream(remotePath);
|
is = client.retrieveFileStream(remotePath);
|
||||||
//发送第二次指令时,还需要再做一次判断
|
//发送第二次指令时,还需要再做一次判断
|
||||||
int reply = client.getReplyCode();
|
int reply = client.getReplyCode();
|
||||||
|
@@ -61,7 +61,7 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
+ "】\n【filePath:"
|
+ "】\n【filePath:"
|
||||||
+ mEntity.getDownloadPath()
|
+ mEntity.getDownloadPath()
|
||||||
+ "】\n"
|
+ "】\n"
|
||||||
+ CommonUtil.getPrintException(e));
|
+ CommonUtil.getPrintException(e), true);
|
||||||
} finally {
|
} finally {
|
||||||
if (conn != null) {
|
if (conn != null) {
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
@@ -103,7 +103,7 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
mTaskEntity.isSupportBP = false;
|
mTaskEntity.isSupportBP = false;
|
||||||
isComplete = true;
|
isComplete = true;
|
||||||
} else if (code == HttpURLConnection.HTTP_NOT_FOUND) {
|
} else if (code == HttpURLConnection.HTTP_NOT_FOUND) {
|
||||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:404");
|
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:404", true);
|
||||||
} else if (code == HttpURLConnection.HTTP_MOVED_TEMP
|
} else if (code == HttpURLConnection.HTTP_MOVED_TEMP
|
||||||
|| code == HttpURLConnection.HTTP_MOVED_PERM
|
|| code == HttpURLConnection.HTTP_MOVED_PERM
|
||||||
|| code == HttpURLConnection.HTTP_SEE_OTHER) {
|
|| code == HttpURLConnection.HTTP_SEE_OTHER) {
|
||||||
@@ -112,7 +112,7 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
mEntity.setRedirectUrl(mTaskEntity.redirectUrl);
|
mEntity.setRedirectUrl(mTaskEntity.redirectUrl);
|
||||||
handle302Turn(conn);
|
handle302Turn(conn);
|
||||||
} else {
|
} else {
|
||||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code);
|
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code, true);
|
||||||
}
|
}
|
||||||
if (isComplete) {
|
if (isComplete) {
|
||||||
if (onFileInfoListener != null) {
|
if (onFileInfoListener != null) {
|
||||||
@@ -130,7 +130,7 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
Log.d(TAG, "30x跳转,location【 " + mTaskEntity.redirectUrlKey + "】" + "新url为【" + newUrl + "】");
|
Log.d(TAG, "30x跳转,location【 " + mTaskEntity.redirectUrlKey + "】" + "新url为【" + newUrl + "】");
|
||||||
if (TextUtils.isEmpty(newUrl) || newUrl.equalsIgnoreCase("null")) {
|
if (TextUtils.isEmpty(newUrl) || newUrl.equalsIgnoreCase("null")) {
|
||||||
if (onFileInfoListener != null) {
|
if (onFileInfoListener != null) {
|
||||||
onFileInfoListener.onFail(mEntity.getUrl(), "获取重定向链接失败");
|
onFileInfoListener.onFail(mEntity.getUrl(), "获取重定向链接失败", false);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -156,16 +156,16 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
mTaskEntity.isNewTask = true;
|
mTaskEntity.isNewTask = true;
|
||||||
}
|
}
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,文件长度小于0");
|
failDownload("任务【" + mEntity.getUrl() + "】下载失败,文件长度小于0", true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void failDownload(String errorMsg) {
|
private void failDownload(String errorMsg, boolean needRetry) {
|
||||||
Log.e(TAG, errorMsg);
|
Log.e(TAG, errorMsg);
|
||||||
if (onFileInfoListener != null) {
|
if (onFileInfoListener != null) {
|
||||||
onFileInfoListener.onFail(mEntity.getUrl(), errorMsg);
|
onFileInfoListener.onFail(mEntity.getUrl(), errorMsg, needRetry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -83,8 +83,8 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
|
|||||||
mDownloader.setMaxSpeed(maxSpeed);
|
mDownloader.setMaxSpeed(maxSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void failDownload(String msg) {
|
private void failDownload(String msg, boolean needRetry) {
|
||||||
mListener.onFail(true);
|
mListener.onFail(needRetry);
|
||||||
ErrorHelp.saveError("HTTP_DOWNLOAD", mTaskEntity.getEntity(), msg, "");
|
ErrorHelp.saveError("HTTP_DOWNLOAD", mTaskEntity.getEntity(), msg, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,8 +108,8 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
|
|||||||
mDownloader.start();
|
mDownloader.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(String url, String errorMsg) {
|
@Override public void onFail(String url, String errorMsg, boolean needRetry) {
|
||||||
failDownload(errorMsg);
|
failDownload(errorMsg, needRetry);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
case AbsTaskEntity.HTTP:
|
case AbsTaskEntity.HTTP:
|
||||||
@@ -118,8 +118,8 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
|
|||||||
mDownloader.start();
|
mDownloader.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(String url, String errorMsg) {
|
@Override public void onFail(String url, String errorMsg, boolean needRetry) {
|
||||||
failDownload(errorMsg);
|
failDownload(errorMsg, needRetry);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.inf;
|
package com.arialyy.aria.core.inf;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.common.RequestEnum;
|
import com.arialyy.aria.core.common.RequestEnum;
|
||||||
import com.arialyy.aria.orm.DbEntity;
|
import com.arialyy.aria.orm.DbEntity;
|
||||||
import com.arialyy.aria.orm.Ignore;
|
import com.arialyy.aria.orm.Ignore;
|
||||||
@@ -48,8 +49,9 @@ public abstract class AbsTaskEntity<ENTITY extends AbsEntity> extends DbEntity {
|
|||||||
/**
|
/**
|
||||||
* 账号和密码
|
* 账号和密码
|
||||||
*/
|
*/
|
||||||
@Ignore public String userName, userPw, account, serverIp;
|
@Ignore public FtpUrlEntity urlEntity;
|
||||||
@Ignore public int port;
|
//@Ignore public String userName, userPw, account, serverIp;
|
||||||
|
//@Ignore public int port;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新信息 {@code true} 重新刷新下载信息
|
* 刷新信息 {@code true} 重新刷新下载信息
|
||||||
|
@@ -22,6 +22,7 @@ import com.arialyy.aria.core.upload.UploadTask;
|
|||||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||||
import com.arialyy.aria.util.CheckUtil;
|
import com.arialyy.aria.util.CheckUtil;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
|
import com.arialyy.aria.util.Regular;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,7 +54,8 @@ public abstract class AbsUploadTarget<TARGET extends AbsUploadTarget, ENTITY ext
|
|||||||
UploadEntity entity = UploadEntity.findFirst(UploadEntity.class, "filePath=?", filePath);
|
UploadEntity entity = UploadEntity.findFirst(UploadEntity.class, "filePath=?", filePath);
|
||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
entity = new UploadEntity();
|
entity = new UploadEntity();
|
||||||
String regex = "[/|\\\\|//]";
|
//String regex = "[/|\\\\|//]";
|
||||||
|
String regex = Regular.REG_FILE_NAME;
|
||||||
Pattern p = Pattern.compile(regex);
|
Pattern p = Pattern.compile(regex);
|
||||||
String[] strs = p.split(filePath);
|
String[] strs = p.split(filePath);
|
||||||
String fileName = strs[strs.length - 1];
|
String fileName = strs[strs.length - 1];
|
||||||
|
@@ -15,11 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.upload;
|
package com.arialyy.aria.core.upload;
|
||||||
|
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsUploadTarget;
|
import com.arialyy.aria.core.inf.AbsUploadTarget;
|
||||||
import com.arialyy.aria.orm.DbEntity;
|
import com.arialyy.aria.orm.DbEntity;
|
||||||
|
import com.arialyy.aria.util.CheckUtil;
|
||||||
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -29,6 +33,7 @@ import java.io.File;
|
|||||||
public class FtpUploadTarget
|
public class FtpUploadTarget
|
||||||
extends AbsUploadTarget<FtpUploadTarget, UploadEntity, UploadTaskEntity> {
|
extends AbsUploadTarget<FtpUploadTarget, UploadEntity, UploadTaskEntity> {
|
||||||
private final String TAG = "FtpUploadTarget";
|
private final String TAG = "FtpUploadTarget";
|
||||||
|
private FtpUrlEntity mUrlEntity;
|
||||||
|
|
||||||
FtpUploadTarget(String filePath, String targetName) {
|
FtpUploadTarget(String filePath, String targetName) {
|
||||||
this.mTargetName = targetName;
|
this.mTargetName = targetName;
|
||||||
@@ -45,13 +50,25 @@ public class FtpUploadTarget
|
|||||||
File file = new File(filePath);
|
File file = new File(filePath);
|
||||||
mEntity.setFileName(file.getName());
|
mEntity.setFileName(file.getName());
|
||||||
mEntity.setFileSize(file.length());
|
mEntity.setFileSize(file.length());
|
||||||
|
|
||||||
//暂时不支持断点续传上传
|
|
||||||
//mTaskEntity.isSupportBP = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ftp 用户登录信息
|
* 设置上传路径
|
||||||
|
*
|
||||||
|
* @param uploadUrl 上传路径
|
||||||
|
*/
|
||||||
|
public FtpUploadTarget setUploadUrl(@NonNull String uploadUrl) {
|
||||||
|
CheckUtil.checkDownloadUrl(uploadUrl);
|
||||||
|
mTaskEntity.urlEntity = CommonUtil.getFtpUrlInfo(uploadUrl);
|
||||||
|
if (mEntity.getUrl().equals(uploadUrl)) return this;
|
||||||
|
mEntity.setUrl(uploadUrl);
|
||||||
|
mEntity.update();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ftp 用户登录信。
|
||||||
|
* 设置登录信息需要在设置上传链接之后{@link #setUploadUrl(String)}
|
||||||
*
|
*
|
||||||
* @param userName ftp用户名
|
* @param userName ftp用户名
|
||||||
* @param password ftp用户密码
|
* @param password ftp用户密码
|
||||||
@@ -62,6 +79,7 @@ public class FtpUploadTarget
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* ftp 用户登录信息
|
* ftp 用户登录信息
|
||||||
|
* 设置登录信息需要在设置上传链接之后{@link #setUploadUrl(String)}
|
||||||
*
|
*
|
||||||
* @param userName ftp用户名
|
* @param userName ftp用户名
|
||||||
* @param password ftp用户密码
|
* @param password ftp用户密码
|
||||||
@@ -75,9 +93,10 @@ public class FtpUploadTarget
|
|||||||
Log.e(TAG, "密码不能为null");
|
Log.e(TAG, "密码不能为null");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
mTaskEntity.userName = userName;
|
mTaskEntity.urlEntity.needLogin = true;
|
||||||
mTaskEntity.userPw = password;
|
mTaskEntity.urlEntity.user = userName;
|
||||||
mTaskEntity.account = account;
|
mTaskEntity.urlEntity.password = password;
|
||||||
|
mTaskEntity.urlEntity.account = account;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -38,9 +38,7 @@ class FtpFileInfoThread extends AbsFtpInfoThread<UploadEntity, UploadTaskEntity>
|
|||||||
|
|
||||||
@Override protected String setRemotePath() {
|
@Override protected String setRemotePath() {
|
||||||
String url = mEntity.getUrl();
|
String url = mEntity.getUrl();
|
||||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length())
|
return mTaskEntity.urlEntity.remotePath + "/" + mEntity.getFileName();
|
||||||
+ "/"
|
|
||||||
+ mEntity.getFileName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -56,8 +56,8 @@ public class SimpleUploadUtil implements IUtil, Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onFail(String url, String errorMsg) {
|
@Override public void onFail(String url, String errorMsg, boolean needRetry) {
|
||||||
mListener.onFail(true);
|
mListener.onFail(needRetry);
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.arialyy.aria.core.AriaManager;
|
import com.arialyy.aria.core.AriaManager;
|
||||||
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.command.ICmd;
|
import com.arialyy.aria.core.command.ICmd;
|
||||||
import com.arialyy.aria.core.command.group.AbsGroupCmd;
|
import com.arialyy.aria.core.command.group.AbsGroupCmd;
|
||||||
import com.arialyy.aria.core.command.group.GroupCmdFactory;
|
import com.arialyy.aria.core.command.group.GroupCmdFactory;
|
||||||
@@ -33,8 +34,8 @@ import com.arialyy.aria.core.download.DownloadEntity;
|
|||||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
|
||||||
import com.arialyy.aria.core.inf.AbsGroupTaskEntity;
|
import com.arialyy.aria.core.inf.AbsGroupTaskEntity;
|
||||||
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||||
import com.arialyy.aria.orm.DbEntity;
|
import com.arialyy.aria.orm.DbEntity;
|
||||||
@@ -74,6 +75,41 @@ import java.util.regex.Pattern;
|
|||||||
public class CommonUtil {
|
public class CommonUtil {
|
||||||
private static final String TAG = "CommonUtil";
|
private static final String TAG = "CommonUtil";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分割获取url,协议,ip/域名,端口,内容
|
||||||
|
*
|
||||||
|
* @param url 输入的url{@code String url = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv";}
|
||||||
|
*/
|
||||||
|
public static FtpUrlEntity getFtpUrlInfo(String url) {
|
||||||
|
FtpUrlEntity entity = new FtpUrlEntity();
|
||||||
|
entity.url = url;
|
||||||
|
//String regex = "(\\w+)://(.*):(\\d*)/(.*)";
|
||||||
|
String regex = Regular.REG_FTP_URL;
|
||||||
|
Pattern p = Pattern.compile(regex);
|
||||||
|
Matcher m = p.matcher(url);
|
||||||
|
if (m.find() && m.groupCount() > 0) {
|
||||||
|
entity.protocol = m.group(1);
|
||||||
|
String str = m.group(2);
|
||||||
|
if (str.contains("@")) {
|
||||||
|
entity.needLogin = true;
|
||||||
|
//String hostReg = "(\\w+):?(\\w+)?@(.*)";
|
||||||
|
String hostReg = Regular.REG_FTP_HOST_NAME;
|
||||||
|
Pattern hp = Pattern.compile(hostReg);
|
||||||
|
Matcher hm = hp.matcher(str);
|
||||||
|
if (hm.find() && hm.groupCount() > 0) {
|
||||||
|
entity.user = hm.group(1);
|
||||||
|
entity.password = TextUtils.isEmpty(hm.group(2)) ? "" : hm.group(2);
|
||||||
|
entity.hostName = hm.group(3);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
entity.hostName = str;
|
||||||
|
}
|
||||||
|
entity.port = m.group(3);
|
||||||
|
entity.remotePath = TextUtils.isEmpty(m.group(4)) ? "/" : "/" + m.group(4);
|
||||||
|
}
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转换Url
|
* 转换Url
|
||||||
*
|
*
|
||||||
|
28
Aria/src/main/java/com/arialyy/aria/util/Regular.java
Normal file
28
Aria/src/main/java/com/arialyy/aria/util/Regular.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package com.arialyy.aria.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Aria.Lao on 2017/10/24.
|
||||||
|
* 正则表达式
|
||||||
|
*/
|
||||||
|
public interface Regular {
|
||||||
|
/**
|
||||||
|
* ftp地址
|
||||||
|
*/
|
||||||
|
String REG_FTP_URL = "(\\w+)://(.*):(\\d*)/(.*)";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ftp主机、用户、密码分割
|
||||||
|
*/
|
||||||
|
String REG_FTP_HOST_NAME = "(\\w+):?(\\w+)?@(.*)";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件名
|
||||||
|
*/
|
||||||
|
String REG_FILE_NAME = "[/|\\\\|//]";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IPV4地址匹配
|
||||||
|
*/
|
||||||
|
String REG_IP_V4 = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
|
||||||
|
|
||||||
|
}
|
@@ -1,4 +1,7 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
//apply plugin: 'kotlin-android'
|
||||||
|
//apply plugin: 'kotlin-android-extensions'
|
||||||
|
//apply plugin: 'kotlin-kapt'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 23
|
compileSdkVersion 23
|
||||||
@@ -30,6 +33,11 @@ android {
|
|||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sourceSets {
|
||||||
|
// main.kotlin.srcDirs += 'src/main/kotlin'
|
||||||
|
// main.java.srcDirs += 'src/main/java'
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -43,6 +51,10 @@ dependencies {
|
|||||||
compile 'com.arialyy.frame:MVVM2:2.2.0'
|
compile 'com.arialyy.frame:MVVM2:2.2.0'
|
||||||
compile project(':Aria')
|
compile project(':Aria')
|
||||||
compile project(':AriaCompiler')
|
compile project(':AriaCompiler')
|
||||||
// compile 'com.arialyy.aria:aria-core:3.2.13'
|
// compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||||
|
// compile 'com.arialyy.aria:aria-core:3.2.13'
|
||||||
// annotationProcessor 'com.arialyy.aria:aria-compiler:3.2.13'
|
// annotationProcessor 'com.arialyy.aria:aria-compiler:3.2.13'
|
||||||
}
|
}
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
<activity android:name=".download.group.FTPDirDownloadActivity"/>
|
<activity android:name=".download.group.FTPDirDownloadActivity"/>
|
||||||
<activity android:name=".upload.HttpUploadActivity"/>
|
<activity android:name=".upload.HttpUploadActivity"/>
|
||||||
<activity android:name=".upload.FtpUploadActivity"/>
|
<activity android:name=".upload.FtpUploadActivity"/>
|
||||||
|
<activity android:name=".download.KotlinDownloadActivity"/>
|
||||||
|
|
||||||
<service android:name=".download.service_download.DownloadService"/>
|
<service android:name=".download.service_download.DownloadService"/>
|
||||||
</application>
|
</application>
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
<maxTaskNum value="1"/>
|
<maxTaskNum value="1"/>
|
||||||
|
|
||||||
<!--设置下载失败,重试次数,默认为10-->
|
<!--设置下载失败,重试次数,默认为10-->
|
||||||
<reTryNum value="10"/>
|
<reTryNum value="2"/>
|
||||||
|
|
||||||
<!--设置重试间隔,单位为毫秒,默认2000毫秒-->
|
<!--设置重试间隔,单位为毫秒,默认2000毫秒-->
|
||||||
<reTryInterval value="5000"/>
|
<reTryInterval value="5000"/>
|
||||||
|
@@ -47,7 +47,7 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
|||||||
|
|
||||||
@OnClick({
|
@OnClick({
|
||||||
R.id.download, R.id.upload, R.id.download_task_group, R.id.ftp_download,
|
R.id.download, R.id.upload, R.id.download_task_group, R.id.ftp_download,
|
||||||
R.id.ftp_dir_download, R.id.ftp_upload
|
R.id.ftp_dir_download, R.id.ftp_upload, R.id.kotlin_download
|
||||||
}) public void funcation(View view) {
|
}) public void funcation(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.download:
|
case R.id.download:
|
||||||
@@ -68,7 +68,9 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
|||||||
case R.id.ftp_upload:
|
case R.id.ftp_upload:
|
||||||
startActivity(new Intent(this, FtpUploadActivity.class));
|
startActivity(new Intent(this, FtpUploadActivity.class));
|
||||||
break;
|
break;
|
||||||
|
case R.id.kotlin_download:
|
||||||
|
//startActivity(new Intent(this, KotlinDownloadActivity.class));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,9 @@ import java.io.File;
|
|||||||
* Ftp下载测试
|
* Ftp下载测试
|
||||||
*/
|
*/
|
||||||
public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding> {
|
public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding> {
|
||||||
private final String URL = "ftp://172.18.104.229:21/haha/测试ss123/ftp_test.apk";
|
private final String URL = "ftp://d:d@dygodj8.com:12311/[电影天堂www.dy2018.com]光辉岁月BD韩语中字.rmvb";
|
||||||
|
//private final String URL = "ftp://192.168.1.9:21/下载/AriaPrj.zip";
|
||||||
|
//private final String URL = "ftp://192.168.1.9:21/下载/[电影天堂www.dy2018.com]赛车总动员3BD中英双字.mp4";
|
||||||
|
|
||||||
@Override protected void init(Bundle savedInstanceState) {
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
super.init(savedInstanceState);
|
super.init(savedInstanceState);
|
||||||
@@ -56,11 +58,10 @@ public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding
|
|||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.start:
|
case R.id.start:
|
||||||
Aria.download(this)
|
Aria.download(this).loadFtp(URL, true)
|
||||||
.loadFtp(URL, true)
|
.charSet("GBK")
|
||||||
.login("lao", "123456")
|
//.login("lao", "123456")
|
||||||
.setDownloadPath("/mnt/sdcard/")
|
.setDownloadPath("/mnt/sdcard/").start();
|
||||||
.start();
|
|
||||||
break;
|
break;
|
||||||
case R.id.stop:
|
case R.id.stop:
|
||||||
Aria.download(this).loadFtp(URL).stop();
|
Aria.download(this).loadFtp(URL).stop();
|
||||||
|
@@ -0,0 +1,73 @@
|
|||||||
|
package com.arialyy.simple.download
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Environment
|
||||||
|
import android.support.v7.app.AppCompatActivity
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.View
|
||||||
|
import com.arialyy.annotations.Download
|
||||||
|
import com.arialyy.aria.core.Aria
|
||||||
|
import com.arialyy.aria.core.download.DownloadTask
|
||||||
|
import com.arialyy.simple.R
|
||||||
|
import com.arialyy.simple.base.BaseActivity
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Aria.Lao on 2017/10/23.
|
||||||
|
*/
|
||||||
|
class KotlinDownloadActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private val DOWNLOAD_URL = "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"
|
||||||
|
|
||||||
|
private val TAG = "KotlinDownloadActivity";
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(setLayoutId())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setLayoutId(): Int {
|
||||||
|
return R.layout.activity_single
|
||||||
|
}
|
||||||
|
|
||||||
|
fun init(savedInstanceState: Bundle?) {
|
||||||
|
title = "单任务下载"
|
||||||
|
// val target = Aria.download(this).load(DOWNLOAD_URL)
|
||||||
|
// binding.progress = target.getPercent()
|
||||||
|
// if (target.getTaskState() == IEntity.STATE_STOP) {
|
||||||
|
// mStart.setText("恢复")
|
||||||
|
// mStart.setTextColor(resources.getColor(android.R.color.holo_blue_light))
|
||||||
|
// setBtState(true)
|
||||||
|
// } else if (target.isDownloading()) {
|
||||||
|
// setBtState(false)
|
||||||
|
// }
|
||||||
|
// binding.fileSize = target.getConvertFileSize()
|
||||||
|
Aria.download(this).register()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Download.onTaskRunning protected fun running(task: DownloadTask) {
|
||||||
|
Log.d(TAG, task.percent.toString() + "")
|
||||||
|
val len = task.fileSize
|
||||||
|
// if (len == 0L) {
|
||||||
|
// binding.progress = 0
|
||||||
|
// } else {
|
||||||
|
// binding.progress = task.percent
|
||||||
|
// }
|
||||||
|
// binding.speed = task.convertSpeed
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onClick(view: View) {
|
||||||
|
when (view.id) {
|
||||||
|
R.id.start -> startD()
|
||||||
|
R.id.stop -> Aria.download(this).load(DOWNLOAD_URL).stop()
|
||||||
|
R.id.cancel -> Aria.download(this).load(DOWNLOAD_URL).cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startD() {
|
||||||
|
Aria.download(this)
|
||||||
|
.load(DOWNLOAD_URL, true)
|
||||||
|
.addHeader("groupName", "value")
|
||||||
|
.setDownloadPath(Environment.getExternalStorageDirectory().path + "/hhhhhhhh.apk")
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
}
|
@@ -18,6 +18,7 @@ package com.arialyy.simple.download;
|
|||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -125,6 +126,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Download.onTaskRunning(DOWNLOAD_URL) protected void running(DownloadTask task) {
|
@Download.onTaskRunning(DOWNLOAD_URL) protected void running(DownloadTask task) {
|
||||||
|
|
||||||
long len = task.getFileSize();
|
long len = task.getFileSize();
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
getBinding().setProgress(0);
|
getBinding().setProgress(0);
|
||||||
@@ -195,11 +197,6 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.start:
|
case R.id.start:
|
||||||
startD();
|
|
||||||
startD();
|
|
||||||
startD();
|
|
||||||
startD();
|
|
||||||
startD();
|
|
||||||
startD();
|
startD();
|
||||||
//new Thread(new Runnable() {
|
//new Thread(new Runnable() {
|
||||||
// @Override public void run() {
|
// @Override public void run() {
|
||||||
|
@@ -57,5 +57,13 @@
|
|||||||
style="?buttonBarButtonStyle"
|
style="?buttonBarButtonStyle"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/kotlin_download"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="kotlin 下载"
|
||||||
|
style="?buttonBarButtonStyle"
|
||||||
|
/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</layout>
|
</layout>
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
buildscript {
|
||||||
|
// ext.kotlin_version = '1.1.51'
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@@ -8,6 +9,7 @@ buildscript {
|
|||||||
// classpath 'com.android.tools.build:gradle:2.3.3'
|
// classpath 'com.android.tools.build:gradle:2.3.3'
|
||||||
classpath 'com.android.tools.build:gradle:2.2.2'
|
classpath 'com.android.tools.build:gradle:2.2.2'
|
||||||
classpath 'com.novoda:bintray-release:0.5.0'
|
classpath 'com.novoda:bintray-release:0.5.0'
|
||||||
|
// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
// classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
|
// classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
|
||||||
// classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
|
// classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
Reference in New Issue
Block a user