修复FTP上传文件不完整的bug,尝试处理ftp 断点续传上传
This commit is contained in:
@@ -23,8 +23,8 @@ dependencies {
|
||||
testCompile 'junit:junit:4.12'
|
||||
compile 'com.android.support:appcompat-v7:23.1.1'
|
||||
compile project(':AriaAnnotations')
|
||||
compile 'com.arialyy.aria:aria-ftp-plug:1.0.0'
|
||||
// compile project(':AriaFtpPlug')
|
||||
// compile 'com.arialyy.aria:aria-ftp-plug:1.0.0'
|
||||
compile project(':AriaFtpPlug')
|
||||
|
||||
}
|
||||
apply from: 'bintray-release.gradle'
|
||||
|
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.common;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.upload.UploadEntity;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import java.io.IOException;
|
||||
import org.apache.commons.net.ftp.FTP;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
import org.apache.commons.net.ftp.FTPFile;
|
||||
import org.apache.commons.net.ftp.FTPReply;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/7/25.
|
||||
* 获取ftp文件夹信息
|
||||
*/
|
||||
public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>>
|
||||
implements Runnable {
|
||||
|
||||
private final String TAG = "HttpFileInfoThread";
|
||||
protected ENTITY mEntity;
|
||||
protected TASK_ENTITY mTaskEntity;
|
||||
private int mConnectTimeOut;
|
||||
protected OnFileInfoCallback mCallback;
|
||||
protected long mSize = 0;
|
||||
protected String mServerIp, mPort;
|
||||
protected String charSet = "UTF-8";
|
||||
private boolean isUpload = false;
|
||||
|
||||
public AbsFtpInfoThread(TASK_ENTITY taskEntity, OnFileInfoCallback callback) {
|
||||
mTaskEntity = taskEntity;
|
||||
mEntity = taskEntity.getEntity();
|
||||
mConnectTimeOut =
|
||||
AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getConnectTimeOut();
|
||||
mCallback = callback;
|
||||
if (mEntity instanceof UploadEntity) {
|
||||
isUpload = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置请求的远程文件路径
|
||||
*
|
||||
* @return 远程文件路径
|
||||
*/
|
||||
protected abstract String setRemotePath();
|
||||
|
||||
@Override public void run() {
|
||||
FTPClient client = null;
|
||||
try {
|
||||
client = createFtpClient();
|
||||
if (client == null) return;
|
||||
String remotePath =
|
||||
new String(setRemotePath().getBytes(charSet), AbsFtpThreadTask.SERVER_CHARSET);
|
||||
FTPFile[] files = client.listFiles(remotePath);
|
||||
mSize = getFileSize(files, client, remotePath);
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
if (isUpload) {
|
||||
//服务器上没有该文件路径,表示该任务为新的上传任务
|
||||
mTaskEntity.isNewTask = true;
|
||||
} else {
|
||||
client.disconnect();
|
||||
failDownload("获取文件信息错误,错误码为:" + reply);
|
||||
return;
|
||||
}
|
||||
}
|
||||
mTaskEntity.code = reply;
|
||||
mEntity.update();
|
||||
mTaskEntity.update();
|
||||
onPreComplete(reply);
|
||||
} catch (IOException e) {
|
||||
failDownload(e.getMessage());
|
||||
} finally {
|
||||
if (client != null) {
|
||||
try {
|
||||
client.disconnect();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
new Thread(this).start();
|
||||
}
|
||||
|
||||
protected void onPreComplete(int code) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建FTP客户端
|
||||
*/
|
||||
private FTPClient createFtpClient() throws IOException {
|
||||
String url = "";
|
||||
if (mEntity instanceof DownloadEntity) {
|
||||
url = ((DownloadEntity) mEntity).getUrl();
|
||||
} else if (mEntity instanceof UploadEntity) {
|
||||
url = ((UploadEntity) mEntity).getUrl();
|
||||
} else if (mEntity instanceof DownloadGroupEntity) {
|
||||
url = mEntity.getKey();
|
||||
} else {
|
||||
failDownload("未知实体");
|
||||
Log.e(TAG, "未知实体");
|
||||
return null;
|
||||
}
|
||||
String[] pp = url.split("/")[2].split(":");
|
||||
mServerIp = pp[0];
|
||||
mPort = pp[1];
|
||||
FTPClient client = new FTPClient();
|
||||
// 连接服务器
|
||||
client.connect(mServerIp, Integer.parseInt(mPort));
|
||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
||||
} else {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
||||
}
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
failDownload("无法连接到ftp服务器,错误码为:" + reply);
|
||||
return null;
|
||||
}
|
||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||
charSet = "UTF-8";
|
||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||
charSet = mTaskEntity.charSet;
|
||||
}
|
||||
client.setControlEncoding(charSet);
|
||||
client.setDataTimeout(10 * 1000);
|
||||
client.enterLocalPassiveMode();
|
||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||
client.setControlKeepAliveTimeout(5);
|
||||
return client;
|
||||
}
|
||||
|
||||
/**
|
||||
* 遍历FTP服务器上对应文件或文件夹大小
|
||||
*
|
||||
* @throws IOException 字符串编码转换错误
|
||||
*/
|
||||
private long getFileSize(FTPFile[] files, FTPClient client, String dirName) throws IOException {
|
||||
long size = 0;
|
||||
String path = dirName + "/";
|
||||
for (FTPFile file : files) {
|
||||
if (file.isFile()) {
|
||||
size += file.getSize();
|
||||
handleFile(path + file.getName(), file);
|
||||
} else {
|
||||
size += getFileSize(client.listFiles(
|
||||
CommonUtil.strCharSetConvert(path + file.getName(), mTaskEntity.charSet)), client,
|
||||
path + file.getName());
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理FTP文件信息
|
||||
*
|
||||
* @param remotePath ftp服务器文件夹路径
|
||||
* @param ftpFile ftp服务器上对应的文件
|
||||
*/
|
||||
protected void handleFile(String remotePath, FTPFile ftpFile) {
|
||||
}
|
||||
|
||||
private void failDownload(String errorMsg) {
|
||||
Log.e(TAG, errorMsg);
|
||||
if (mCallback != null) {
|
||||
mCallback.onFail(mEntity.getKey(), errorMsg);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.common;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import com.arialyy.aria.core.inf.AbsNormalEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IEventListener;
|
||||
import java.io.IOException;
|
||||
import org.apache.commons.net.ftp.FTP;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
import org.apache.commons.net.ftp.FTPReply;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2017/9/26.
|
||||
* FTP单任务父类
|
||||
*/
|
||||
public abstract class AbsFtpThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>>
|
||||
extends AbsThreadTask<ENTITY, TASK_ENTITY> {
|
||||
protected String charSet, serverIp, port;
|
||||
/**
|
||||
* FTP 服务器编码
|
||||
*/
|
||||
public static String SERVER_CHARSET = "ISO-8859-1";
|
||||
|
||||
protected AbsFtpThreadTask(StateConstance constance, IEventListener listener,
|
||||
SubThreadConfig<TASK_ENTITY> info) {
|
||||
super(constance, listener, info);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建FTP客户端
|
||||
*/
|
||||
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();
|
||||
// 连接服务器
|
||||
client.connect(serverIp, Integer.parseInt(port));
|
||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
||||
} else {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
||||
}
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
fail(STATE.CURRENT_LOCATION, "无法连接到ftp服务器,错误码为:" + reply, null);
|
||||
return null;
|
||||
}
|
||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||
charSet = "UTF-8";
|
||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||
charSet = mTaskEntity.charSet;
|
||||
}
|
||||
client.setControlEncoding(charSet);
|
||||
client.setDataTimeout(STATE.READ_TIME_OUT);
|
||||
client.enterLocalPassiveMode();
|
||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||
client.setBufferSize(mBufSize);
|
||||
//client.setControlKeepAliveTimeout(5);
|
||||
//client.setCopyStreamListener();
|
||||
return client;
|
||||
}
|
||||
}
|
@@ -19,7 +19,7 @@ import android.os.Build;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.aria.core.inf.AbsNormalEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IEventListener;
|
||||
import com.arialyy.aria.core.upload.UploadEntity;
|
||||
@@ -37,7 +37,7 @@ import java.util.TimerTask;
|
||||
* Created by lyy on 2017/1/18.
|
||||
* 任务线程
|
||||
*/
|
||||
public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>>
|
||||
public abstract class AbsThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>>
|
||||
implements Runnable {
|
||||
/**
|
||||
* 线程重试次数
|
||||
@@ -56,10 +56,6 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
protected SubThreadConfig<TASK_ENTITY> mConfig;
|
||||
protected ENTITY mEntity;
|
||||
protected TASK_ENTITY mTaskEntity;
|
||||
/**
|
||||
* FTP 服务器编码
|
||||
*/
|
||||
public static String SERVER_CHARSET = "ISO-8859-1";
|
||||
private int mFailNum = 0;
|
||||
private String mTaskType;
|
||||
private Timer mFailTimer;
|
||||
@@ -74,9 +70,7 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
mConfig = info;
|
||||
mTaskEntity = mConfig.TASK_ENTITY;
|
||||
mEntity = mTaskEntity.getEntity();
|
||||
if (mConfig.SUPPORT_BP) {
|
||||
mConfigFPath = info.CONFIG_FILE_PATH;
|
||||
}
|
||||
mConfigFPath = info.CONFIG_FILE_PATH;
|
||||
mBufSize = manager.getDownloadConfig().getBuffSize();
|
||||
setMaxSpeed(AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getMsxSpeed());
|
||||
mTaskType = getTaskType();
|
||||
@@ -105,14 +99,15 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
synchronized (AriaManager.LOCK) {
|
||||
try {
|
||||
if (mConfig.SUPPORT_BP) {
|
||||
final long currentTemp = mChildCurrentLocation;
|
||||
STATE.STOP_NUM++;
|
||||
Log.d(TAG, "任务【"
|
||||
+ mConfig.TEMP_FILE.getName()
|
||||
+ "】thread__"
|
||||
+ mConfig.THREAD_ID
|
||||
+ "__停止, stop location ==> "
|
||||
+ mChildCurrentLocation);
|
||||
writeConfig(false, mChildCurrentLocation);
|
||||
+ currentTemp);
|
||||
writeConfig(false, currentTemp);
|
||||
if (STATE.isStop()) {
|
||||
Log.d(TAG, "任务【" + mConfig.TEMP_FILE.getName() + "】已停止");
|
||||
STATE.isRunning = false;
|
||||
@@ -170,7 +165,7 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
/**
|
||||
* 任务失败
|
||||
*/
|
||||
protected void fail(long currentLocation, String msg, Exception ex) {
|
||||
protected void fail(final long currentLocation, String msg, Exception ex) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
try {
|
||||
if (ex != null) {
|
||||
@@ -213,7 +208,8 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
mFailNum++;
|
||||
Log.w(TAG,
|
||||
"任务【" + mConfig.TEMP_FILE.getName() + "】thread__" + mConfig.THREAD_ID + "__正在重试");
|
||||
mConfig.START_LOCATION = mChildCurrentLocation;
|
||||
final long retryLocation = mChildCurrentLocation;
|
||||
mConfig.START_LOCATION = retryLocation;
|
||||
AbsThreadTask.this.run();
|
||||
}
|
||||
}, RETRY_INTERVAL);
|
||||
@@ -231,8 +227,9 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend
|
||||
/**
|
||||
* 将记录写入到配置文件
|
||||
*/
|
||||
protected void writeConfig(boolean isComplete, long record) throws IOException {
|
||||
protected void writeConfig(boolean isComplete, final long record) throws IOException {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
Log.d(TAG, "really record == " + record);
|
||||
String key = null, value = null;
|
||||
if (0 < record && record < mConfig.END_LOCATION) {
|
||||
key = mConfig.TEMP_FILE.getName() + "_record_" + mConfig.THREAD_ID;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
package com.arialyy.aria.core.common;
|
||||
|
||||
interface OnFileInfoCallback {
|
||||
public interface OnFileInfoCallback {
|
||||
/**
|
||||
* 处理完成
|
||||
*
|
@@ -1,155 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.common.AbsThreadTask;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import java.io.IOException;
|
||||
import org.apache.commons.net.ftp.FTP;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
import org.apache.commons.net.ftp.FTPFile;
|
||||
import org.apache.commons.net.ftp.FTPReply;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/7/25.
|
||||
* 获取ftp文件夹信息
|
||||
*/
|
||||
abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>>
|
||||
implements Runnable {
|
||||
|
||||
private final String TAG = "HttpFileInfoThread";
|
||||
protected ENTITY mEntity;
|
||||
protected TASK_ENTITY mTaskEntity;
|
||||
private int mConnectTimeOut;
|
||||
private OnFileInfoCallback mCallback;
|
||||
protected long mSize = 0;
|
||||
|
||||
AbsFtpInfoThread(TASK_ENTITY taskEntity, OnFileInfoCallback callback) {
|
||||
mTaskEntity = taskEntity;
|
||||
mEntity = taskEntity.getEntity();
|
||||
mConnectTimeOut =
|
||||
AriaManager.getInstance(AriaManager.APP).getDownloadConfig().getConnectTimeOut();
|
||||
mCallback = callback;
|
||||
}
|
||||
|
||||
@Override public void run() {
|
||||
FTPClient client = null;
|
||||
try {
|
||||
String url = mTaskEntity.getEntity().getKey();
|
||||
String[] pp = url.split("/")[2].split(":");
|
||||
String serverIp = pp[0];
|
||||
int port = Integer.parseInt(pp[1]);
|
||||
String remotePath = url.substring(url.indexOf(pp[1]) + pp[1].length(), url.length());
|
||||
client = new FTPClient();
|
||||
client.connect(serverIp, port);
|
||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
||||
} else {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
||||
}
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
failDownload("无法连接到ftp服务器,错误码为:" + reply);
|
||||
return;
|
||||
}
|
||||
client.setDataTimeout(mConnectTimeOut);
|
||||
String charSet = "UTF-8";
|
||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||
charSet = mTaskEntity.charSet;
|
||||
}
|
||||
client.setControlEncoding(charSet);
|
||||
client.enterLocalPassiveMode();
|
||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||
FTPFile[] files =
|
||||
client.listFiles(new String(remotePath.getBytes(charSet), AbsThreadTask.SERVER_CHARSET));
|
||||
mSize = getFileSize(files, client, remotePath);
|
||||
reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
failDownload("获取文件信息错误,错误码为:" + reply);
|
||||
return;
|
||||
}
|
||||
mTaskEntity.code = reply;
|
||||
onPreComplete();
|
||||
mEntity.update();
|
||||
mTaskEntity.update();
|
||||
mCallback.onComplete(mEntity.getKey(), reply);
|
||||
} catch (IOException e) {
|
||||
failDownload(e.getMessage());
|
||||
} finally {
|
||||
if (client != null) {
|
||||
try {
|
||||
client.disconnect();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void start() {
|
||||
new Thread(this).start();
|
||||
}
|
||||
|
||||
protected void onPreComplete() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 遍历FTP服务器上对应文件或文件夹大小
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
private long getFileSize(FTPFile[] files, FTPClient client, String dirName) throws IOException {
|
||||
long size = 0;
|
||||
String path = dirName + "/";
|
||||
for (FTPFile file : files) {
|
||||
if (file.isFile()) {
|
||||
size += file.getSize();
|
||||
handleFile(path + file.getName(), file);
|
||||
} else {
|
||||
size += getFileSize(client.listFiles(
|
||||
CommonUtil.strCharSetConvert(path + file.getName(), mTaskEntity.charSet)), client,
|
||||
path + file.getName());
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理FTP文件信息
|
||||
*
|
||||
* @param remotePath ftp服务器文件夹路径
|
||||
* @param ftpFile ftp服务器上对应的文件
|
||||
*/
|
||||
void handleFile(String remotePath, FTPFile ftpFile) {
|
||||
}
|
||||
|
||||
private void failDownload(String errorMsg) {
|
||||
Log.e(TAG, errorMsg);
|
||||
if (mCallback != null) {
|
||||
mCallback.onFail(mEntity.getKey(), errorMsg);
|
||||
}
|
||||
}
|
||||
}
|
@@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import android.util.SparseArray;
|
||||
import com.arialyy.aria.core.common.IUtil;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IEntity;
|
||||
|
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
|
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||
@@ -33,14 +35,20 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro
|
||||
super(taskEntity, callback);
|
||||
}
|
||||
|
||||
@Override void handleFile(String remotePath, FTPFile ftpFile) {
|
||||
@Override protected String setRemotePath() {
|
||||
String url = mEntity.getKey();
|
||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length());
|
||||
}
|
||||
|
||||
@Override protected void handleFile(String remotePath, FTPFile ftpFile) {
|
||||
super.handleFile(remotePath, ftpFile);
|
||||
addEntity(remotePath, ftpFile);
|
||||
}
|
||||
|
||||
@Override protected void onPreComplete() {
|
||||
super.onPreComplete();
|
||||
@Override protected void onPreComplete(int code) {
|
||||
super.onPreComplete(code);
|
||||
mEntity.setFileSize(mSize);
|
||||
mCallback.onComplete(mEntity.getKey(), code);
|
||||
}
|
||||
|
||||
private void addEntity(String remotePath, FTPFile ftpFile) {
|
||||
|
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
|
||||
@@ -28,8 +30,15 @@ class FtpFileInfoThread extends AbsFtpInfoThread<DownloadEntity, DownloadTaskEnt
|
||||
super(taskEntity, callback);
|
||||
}
|
||||
|
||||
@Override protected void onPreComplete() {
|
||||
super.onPreComplete();
|
||||
@Override protected String setRemotePath() {
|
||||
String url = mEntity.getUrl();
|
||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length())
|
||||
+ "/"
|
||||
+ mEntity.getFileName();
|
||||
}
|
||||
|
||||
@Override protected void onPreComplete(int code) {
|
||||
super.onPreComplete(code);
|
||||
if (mSize != mTaskEntity.getEntity().getFileSize()) {
|
||||
mTaskEntity.isNewTask = true;
|
||||
}
|
||||
|
@@ -15,9 +15,8 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.common.AbsThreadTask;
|
||||
import com.arialyy.aria.core.common.AbsFtpThreadTask;
|
||||
import com.arialyy.aria.core.common.StateConstance;
|
||||
import com.arialyy.aria.core.common.SubThreadConfig;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
@@ -27,7 +26,6 @@ import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import org.apache.commons.net.ftp.FTP;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
import org.apache.commons.net.ftp.FTPReply;
|
||||
|
||||
@@ -35,7 +33,7 @@ import org.apache.commons.net.ftp.FTPReply;
|
||||
* Created by Aria.Lao on 2017/7/24.
|
||||
* Ftp下载任务
|
||||
*/
|
||||
class FtpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEntity> {
|
||||
class FtpThreadTask extends AbsFtpThreadTask<DownloadEntity, DownloadTaskEntity> {
|
||||
private final String TAG = "FtpThreadTask";
|
||||
|
||||
FtpThreadTask(StateConstance constance, IDownloadListener listener,
|
||||
@@ -57,40 +55,16 @@ class FtpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEntity> {
|
||||
+ ",结束位置:"
|
||||
+ mConfig.END_LOCATION
|
||||
+ "】");
|
||||
client = createClient();
|
||||
if (client == null) return;
|
||||
String url = mEntity.getUrl();
|
||||
String[] pp = url.split("/")[2].split(":");
|
||||
String serverIp = pp[0];
|
||||
int port = Integer.parseInt(pp[1]);
|
||||
String remotePath = url.substring(url.indexOf(pp[1]) + pp[1].length(), url.length());
|
||||
client = new FTPClient();
|
||||
client.connect(serverIp, port);
|
||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
||||
} else {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
||||
}
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
fail(STATE.CURRENT_LOCATION, "无法连接到ftp服务器,错误码为:" + reply, null);
|
||||
return;
|
||||
}
|
||||
String charSet = "UTF-8";
|
||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||
charSet = mTaskEntity.charSet;
|
||||
}
|
||||
client.setControlEncoding(charSet);
|
||||
client.setDataTimeout(STATE.READ_TIME_OUT);
|
||||
client.enterLocalPassiveMode();
|
||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||
String remotePath = new String(
|
||||
url.substring(url.indexOf(port) + port.length(), url.length()).getBytes(charSet),
|
||||
SERVER_CHARSET);
|
||||
client.setRestartOffset(mConfig.START_LOCATION);
|
||||
client.allocate(mBufSize);
|
||||
is = client.retrieveFileStream(
|
||||
new String(remotePath.getBytes(charSet), SERVER_CHARSET));
|
||||
is = client.retrieveFileStream(remotePath);
|
||||
//发送第二次指令时,还需要再做一次判断
|
||||
reply = client.getReplyCode();
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositivePreliminary(reply)) {
|
||||
client.disconnect();
|
||||
fail(mChildCurrentLocation, "获取文件信息错误,错误码为:" + reply, null);
|
||||
|
@@ -18,6 +18,7 @@ package com.arialyy.aria.core.download.downloader;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
|
@@ -17,6 +17,7 @@
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import com.arialyy.aria.core.common.IUtil;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IDownloadListener;
|
||||
|
@@ -45,6 +45,9 @@ public class FtpUploadTarget
|
||||
File file = new File(filePath);
|
||||
mEntity.setFileName(file.getName());
|
||||
mEntity.setFileSize(file.length());
|
||||
|
||||
//暂时不支持断点续传上传
|
||||
mTaskEntity.isSupportBP = false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.upload.uploader;
|
||||
|
||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.upload.UploadEntity;
|
||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||
import org.apache.commons.net.ftp.FTPFile;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/9/26.
|
||||
* FTP远程服务器文件信息
|
||||
*/
|
||||
class FtpFileInfoThread extends AbsFtpInfoThread<UploadEntity, UploadTaskEntity> {
|
||||
static final int CODE_EXISTS = 0xab1;
|
||||
private boolean exists = false;
|
||||
|
||||
FtpFileInfoThread(UploadTaskEntity taskEntity, OnFileInfoCallback callback) {
|
||||
super(taskEntity, callback);
|
||||
}
|
||||
|
||||
@Override protected String setRemotePath() {
|
||||
String url = mEntity.getUrl();
|
||||
return url.substring(url.indexOf(mPort) + mPort.length(), url.length())
|
||||
+ "/"
|
||||
+ mEntity.getFileName();
|
||||
}
|
||||
|
||||
@Override protected void handleFile(String remotePath, FTPFile ftpFile) {
|
||||
super.handleFile(remotePath, ftpFile);
|
||||
//远程文件已完成
|
||||
if (ftpFile != null && ftpFile.getSize() == mEntity.getFileSize()) {
|
||||
exists = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override protected void onPreComplete(int code) {
|
||||
super.onPreComplete(code);
|
||||
mCallback.onComplete(mEntity.getKey(), exists ? CODE_EXISTS : code);
|
||||
}
|
||||
}
|
@@ -15,9 +15,8 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.upload.uploader;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.common.AbsThreadTask;
|
||||
import com.arialyy.aria.core.common.AbsFtpThreadTask;
|
||||
import com.arialyy.aria.core.common.StateConstance;
|
||||
import com.arialyy.aria.core.common.SubThreadConfig;
|
||||
import com.arialyy.aria.core.inf.IEventListener;
|
||||
@@ -27,28 +26,29 @@ import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import org.apache.commons.net.ftp.FTP;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
import org.apache.commons.net.ftp.FTPFile;
|
||||
import org.apache.commons.net.ftp.FTPReply;
|
||||
import org.apache.commons.net.ftp.OnFtpInputStreamListener;
|
||||
import org.apache.commons.net.io.CopyStreamEvent;
|
||||
import org.apache.commons.net.io.CopyStreamListener;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/7/28.
|
||||
* FTP 单线程上传任务,需要FTP 服务器给用户打开删除和读入IO的权限
|
||||
*/
|
||||
class FtpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
class FtpThreadTask extends AbsFtpThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
private final String TAG = "FtpThreadTask";
|
||||
private String dir, remotePath, charSet;
|
||||
private String dir, remotePath;
|
||||
|
||||
FtpThreadTask(StateConstance constance, IEventListener listener,
|
||||
SubThreadConfig<UploadTaskEntity> info) {
|
||||
super(constance, listener, info);
|
||||
}
|
||||
|
||||
|
||||
@Override public void run() {
|
||||
FTPClient client = null;
|
||||
OutputStream os = null;
|
||||
BufferedRandomAccessFile file = null;
|
||||
try {
|
||||
Log.d(TAG, "任务【"
|
||||
@@ -64,22 +64,16 @@ class FtpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
mChildCurrentLocation = mConfig.START_LOCATION;
|
||||
client = createClient();
|
||||
if (client == null) return;
|
||||
initPath();
|
||||
client.makeDirectory(dir);
|
||||
client.changeWorkingDirectory(dir);
|
||||
client.setRestartOffset(mConfig.START_LOCATION);
|
||||
file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize);
|
||||
file.seek(mConfig.START_LOCATION);
|
||||
if (!isRemoteComplete(client)) {
|
||||
os = client.storeFileStream(new String(remotePath.getBytes(charSet), SERVER_CHARSET));
|
||||
//发送第二次指令时,还需要再做一次判断
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositivePreliminary(reply)) {
|
||||
client.disconnect();
|
||||
fail(mChildCurrentLocation, "上传文件错误,错误码为:" + reply, null);
|
||||
return;
|
||||
}
|
||||
upload(file, os);
|
||||
if (mConfig.START_LOCATION != 0) {
|
||||
file.skipBytes((int) mConfig.START_LOCATION);
|
||||
//file.seek(mConfig.START_LOCATION);
|
||||
}
|
||||
upload(client, file);
|
||||
if (STATE.isCancel || STATE.isStop) return;
|
||||
Log.i(TAG, "任务【" + mConfig.TEMP_FILE.getName() + "】线程__" + mConfig.THREAD_ID + "__上传完毕");
|
||||
writeConfig(true, 1);
|
||||
@@ -101,9 +95,6 @@ class FtpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
if (file != null) {
|
||||
file.close();
|
||||
}
|
||||
if (os != null) {
|
||||
os.close();
|
||||
}
|
||||
if (client != null && client.isConnected()) {
|
||||
client.disconnect();
|
||||
}
|
||||
@@ -113,14 +104,55 @@ class FtpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 远程文件是否已经玩飞车
|
||||
*
|
||||
* @return true 任务已经完成
|
||||
*/
|
||||
private boolean isRemoteComplete(FTPClient client) throws IOException {
|
||||
FTPFile[] files = client.listFiles(new String(remotePath.getBytes(charSet), SERVER_CHARSET));
|
||||
return files.length != 0 && files[0].getSize() == mEntity.getFileSize();
|
||||
private void initPath() throws UnsupportedEncodingException {
|
||||
String url = mEntity.getUrl();
|
||||
String temp = url.substring(url.indexOf(port) + port.length(), url.length());
|
||||
dir = new String(temp.getBytes(charSet), SERVER_CHARSET);
|
||||
remotePath = new String((temp + "/" + mEntity.getFileName()).getBytes(charSet), SERVER_CHARSET);
|
||||
}
|
||||
|
||||
private void upload(final FTPClient client, final BufferedRandomAccessFile bis)
|
||||
throws IOException {
|
||||
//client.storeFile(remotePath,
|
||||
// new ProgressInputStream(bis, new ProgressInputStream.ProgressCallback() {
|
||||
// @Override public void onProgressCallback(byte[] buffer, int byteOffset, int byteCount)
|
||||
// throws IOException {
|
||||
// if (STATE.isCancel || STATE.isStop) {
|
||||
// long s = client.abor();
|
||||
// Log.d(TAG, "s = " + s);
|
||||
// client.disconnect();
|
||||
// }
|
||||
// progress(byteCount);
|
||||
// }
|
||||
// }));
|
||||
|
||||
|
||||
|
||||
try {
|
||||
client.storeFile(remotePath, new ProgressInputStream(bis), new OnFtpInputStreamListener() {
|
||||
@Override public void onFtpInputStream(FTPClient client, long totalBytesTransferred,
|
||||
int bytesTransferred, long streamSize) {
|
||||
if (STATE.isCancel || STATE.isStop) {
|
||||
try {
|
||||
client.abor();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
progress(bytesTransferred);
|
||||
}
|
||||
});
|
||||
|
||||
} catch (IOException e) {
|
||||
//e.printStackTrace();
|
||||
}
|
||||
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
fail(mChildCurrentLocation, "上传文件错误,错误码为:" + reply, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -143,48 +175,11 @@ class FtpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> {
|
||||
os.write(buffer, 0, len);
|
||||
progress(len);
|
||||
}
|
||||
Log.d(TAG, len + "");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建FTP客户端
|
||||
*/
|
||||
private FTPClient createClient() throws IOException {
|
||||
String url = mEntity.getUrl();
|
||||
String[] pp = url.split("/")[2].split(":");
|
||||
String serverIp = pp[0];
|
||||
int port = Integer.parseInt(pp[1]);
|
||||
dir = url.substring(url.indexOf(pp[1]) + pp[1].length(), url.length());
|
||||
remotePath = dir + "/" + mEntity.getFileName();
|
||||
FTPClient client = new FTPClient();
|
||||
client.connect(serverIp, port);
|
||||
if (!TextUtils.isEmpty(mTaskEntity.account)) {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw);
|
||||
} else {
|
||||
client.login(mTaskEntity.userName, mTaskEntity.userPw, mTaskEntity.account);
|
||||
}
|
||||
int reply = client.getReplyCode();
|
||||
if (!FTPReply.isPositiveCompletion(reply)) {
|
||||
client.disconnect();
|
||||
fail(STATE.CURRENT_LOCATION, "无法连接到ftp服务器,错误码为:" + reply, null);
|
||||
return null;
|
||||
}
|
||||
charSet = "UTF-8";
|
||||
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码
|
||||
if (!TextUtils.isEmpty(mTaskEntity.charSet) || !FTPReply.isPositiveCompletion(
|
||||
client.sendCommand("OPTS UTF8", "ON"))) {
|
||||
charSet = mTaskEntity.charSet;
|
||||
}
|
||||
client.setControlEncoding(charSet);
|
||||
client.setDataTimeout(STATE.READ_TIME_OUT);
|
||||
client.enterLocalPassiveMode();
|
||||
client.setFileType(FTP.BINARY_FILE_TYPE);
|
||||
client.allocate(mBufSize);
|
||||
return client;
|
||||
}
|
||||
|
||||
@Override protected String getTaskType() {
|
||||
return "FTP_UPLOAD";
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.upload.uploader;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2017/9/26.
|
||||
* 具有进度的InputStream
|
||||
*/
|
||||
final class ProgressInputStream extends InputStream {
|
||||
|
||||
private BufferedRandomAccessFile mIs;
|
||||
private ProgressCallback mCallback;
|
||||
private int count;
|
||||
|
||||
interface ProgressCallback {
|
||||
void onProgressCallback(byte[] buffer, int byteOffset, int byteCount) throws IOException;
|
||||
}
|
||||
|
||||
ProgressInputStream(@NonNull BufferedRandomAccessFile is, @NonNull ProgressCallback callback) {
|
||||
mIs = is;
|
||||
mCallback = callback;
|
||||
}
|
||||
|
||||
ProgressInputStream(@NonNull BufferedRandomAccessFile is) {
|
||||
mIs = is;
|
||||
}
|
||||
|
||||
@Override public void close() throws IOException {
|
||||
mIs.close();
|
||||
}
|
||||
|
||||
@Override public int read() throws IOException {
|
||||
return mIs.read();
|
||||
}
|
||||
|
||||
@Override public int read(@NonNull byte[] buffer) throws IOException {
|
||||
count = mIs.read(buffer);
|
||||
if (mCallback != null) {
|
||||
mCallback.onProgressCallback(buffer, 0, count);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override public int read(@NonNull byte[] buffer, int byteOffset, int byteCount)
|
||||
throws IOException {
|
||||
count = mIs.read(buffer, byteOffset, byteCount);
|
||||
if (mCallback != null) {
|
||||
mCallback.onProgressCallback(buffer, byteOffset, byteCount);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override public long skip(long byteCount) throws IOException {
|
||||
return mIs.skipBytes((int) byteCount);
|
||||
}
|
||||
}
|
@@ -16,6 +16,7 @@
|
||||
package com.arialyy.aria.core.upload.uploader;
|
||||
|
||||
import com.arialyy.aria.core.common.IUtil;
|
||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.inf.IUploadListener;
|
||||
import com.arialyy.aria.core.upload.UploadEntity;
|
||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||
@@ -46,7 +47,19 @@ public class SimpleUploadUtil implements IUtil, Runnable {
|
||||
|
||||
@Override public void run() {
|
||||
mListener.onPre();
|
||||
mUploader.start();
|
||||
new FtpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
||||
@Override public void onComplete(String url, int code) {
|
||||
if (code == FtpFileInfoThread.CODE_EXISTS) {
|
||||
mListener.onComplete();
|
||||
} else {
|
||||
mUploader.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onFail(String url, String errorMsg) {
|
||||
mListener.onFail(true);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
@Override public long getFileSize() {
|
||||
|
@@ -230,7 +230,7 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* 遍历所有数据
|
||||
* 查找表的所有数据
|
||||
*/
|
||||
static synchronized <T extends DbEntity> List<T> findAllData(SQLiteDatabase db, Class<T> clazz) {
|
||||
db = checkDb(db);
|
||||
|
@@ -705,6 +705,7 @@ public class CommonUtil {
|
||||
* 设置打印的异常格式
|
||||
*/
|
||||
public static String getPrintException(Throwable ex) {
|
||||
if (ex == null) return "";
|
||||
StringBuilder err = new StringBuilder();
|
||||
err.append("ExceptionDetailed:\n");
|
||||
err.append("====================Exception Info====================\n");
|
||||
|
Reference in New Issue
Block a user