1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-08 00:16:09 +00:00

Chunked uploads, create chunks folder [WIP]

This commit is contained in:
davigonz 2018-06-22 15:06:42 +02:00
parent f218a60611
commit 2d54ece72e
16 changed files with 48 additions and 62 deletions

View File

@ -35,7 +35,6 @@ import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory
import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory.OwnCloudAnonymousCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory.OwnCloudAnonymousCredentials;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod; import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import com.owncloud.android.lib.common.network.RedirectionPath; import com.owncloud.android.lib.common.network.RedirectionPath;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
@ -58,7 +57,8 @@ import java.io.InputStream;
public class OwnCloudClient extends HttpClient { public class OwnCloudClient extends HttpClient {
public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav"; public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav";
public static final String NEW_WEBDAV_PATH_4_0 = "/remote.php/dav/files/"; public static final String NEW_WEBDAV_FILES_PATH_4_0 = "/remote.php/dav/files/";
public static final String NEW_WEBDAV_UPLOADS_PATH_4_0 = "/remote.php/dav/files/";
public static final String STATUS_PATH = "/status.php"; public static final String STATUS_PATH = "/status.php";
public static final String FILES_WEB_PATH = "/index.php/apps/files"; public static final String FILES_WEB_PATH = "/index.php/apps/files";
@ -284,7 +284,8 @@ public class OwnCloudClient extends HttpClient {
int status; int status;
do { do {
method.setFollowRedirects(mFollowRedirects); //TODO Dav4Android doesn't allow follow redirections right now
// method.setFollowRedirects(mFollowRedirects);
status = method.execute(); status = method.execute();
repeatWithFreshCredentials = checkUnauthorizedAccess(status, repeatCounter); repeatWithFreshCredentials = checkUnauthorizedAccess(status, repeatCounter);
if (repeatWithFreshCredentials) { if (repeatWithFreshCredentials) {
@ -293,8 +294,6 @@ public class OwnCloudClient extends HttpClient {
} while (repeatWithFreshCredentials); } while (repeatWithFreshCredentials);
return status; return status;
} }
private void checkFirstRedirection(HttpMethod method) { private void checkFirstRedirection(HttpMethod method) {
@ -422,14 +421,20 @@ public class OwnCloudClient extends HttpClient {
} }
} }
public Uri getWebdavUri() { public Uri getOldFilesWebdavUri() {
return Uri.parse(mBaseUri + WEBDAV_PATH_4_0); return Uri.parse(mBaseUri + WEBDAV_PATH_4_0);
} }
public Uri getNewWebDavUri() { public Uri getNewFilesWebDavUri() {
return mCredentials instanceof OwnCloudAnonymousCredentials return mCredentials instanceof OwnCloudAnonymousCredentials
? Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0) ? Uri.parse(mBaseUri + NEW_WEBDAV_FILES_PATH_4_0)
: Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0 + mCredentials.getUsername()); : Uri.parse(mBaseUri + NEW_WEBDAV_FILES_PATH_4_0 + mCredentials.getUsername());
}
public Uri getNewUploadsWebDavUri() {
return mCredentials instanceof OwnCloudAnonymousCredentials
? Uri.parse(mBaseUri + NEW_WEBDAV_UPLOADS_PATH_4_0)
: Uri.parse(mBaseUri + NEW_WEBDAV_UPLOADS_PATH_4_0 + mCredentials.getUsername());
} }
/** /**

View File

@ -28,7 +28,6 @@ package com.owncloud.android.lib.common.accounts;
import java.io.IOException; import java.io.IOException;
import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpStatus;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
@ -38,12 +37,9 @@ import android.accounts.OperationCanceledException;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
@ -239,7 +235,7 @@ public class AccountUtils {
// Account Manager // Account Manager
AccountManager am = AccountManager.get(context.getApplicationContext()); AccountManager am = AccountManager.get(context.getApplicationContext());
Uri serverUri = (client.getBaseUri() != null) ? client.getBaseUri() : client.getWebdavUri(); Uri serverUri = (client.getBaseUri() != null) ? client.getBaseUri() : client.getOldFilesWebdavUri();
String cookiesString = am.getUserData(account, Constants.KEY_COOKIES); String cookiesString = am.getUserData(account, Constants.KEY_COOKIES);
if (cookiesString != null) { if (cookiesString != null) {

View File

@ -65,19 +65,6 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
FileChannel channel = null; FileChannel channel = null;
RandomAccessFile raf = null; RandomAccessFile raf = null;
//MKCOL
try {
MkColMethod mkcol = new MkColMethod(
HttpUtils.stringUrlToHttpUrl(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath))
);
String a = "";
} catch (Exception e) {
String b = "";
}
//TODO //TODO
// try { // try {
// File file = new File(mLocalPath); // File file = new File(mLocalPath);
@ -90,7 +77,7 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
// } // }
// //
// long offset = 0; // long offset = 0;
// String uriPrefix = client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath) + // String uriPrefix = client.getOldWebdavUri() + WebdavUtils.encodePath(mRemotePath) +
// "-chunking-" + Math.abs((new Random()).nextInt(9000) + 1000) + "-"; // "-chunking-" + Math.abs((new Random()).nextInt(9000) + 1000) + "-";
// long totalLength = file.length(); // long totalLength = file.length();
// long chunkCount = (long) Math.ceil((double) totalLength / CHUNK_SIZE); // long chunkCount = (long) Math.ceil((double) totalLength / CHUNK_SIZE);
@ -154,5 +141,4 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
// } // }
return result; return result;
} }
} }

View File

@ -104,8 +104,8 @@ public class CopyRemoteFileOperation extends RemoteOperation {
RemoteOperationResult result = null; RemoteOperationResult result = null;
try { try {
CopyMethod copyMethod = new CopyMethod( CopyMethod copyMethod = new CopyMethod(
HttpUrl.parse(client.getWebdavUri() + WebdavUtils.encodePath(mSrcRemotePath)), HttpUrl.parse(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mSrcRemotePath)),
client.getWebdavUri() + WebdavUtils.encodePath(mTargetRemotePath), client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath),
mOverwrite); mOverwrite);
copyMethod.setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS); copyMethod.setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS);

View File

@ -25,6 +25,8 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import android.net.Uri;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.MkColMethod; import com.owncloud.android.lib.common.http.methods.webdav.MkColMethod;
@ -53,20 +55,20 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
private static final int READ_TIMEOUT = 30000; private static final int READ_TIMEOUT = 30000;
private static final int CONNECTION_TIMEOUT = 5000; private static final int CONNECTION_TIMEOUT = 5000;
private String mRemotePath;
protected String mRemotePath; private boolean mCreateFullPath;
protected boolean mCreateFullPath; private boolean mFolderToSaveChunks;
/** /**
* Constructor * Constructor
*
* @param remotePath Full path to the new directory to create in the remote server. * @param remotePath Full path to the new directory to create in the remote server.
* @param createFullPath 'True' means that all the ancestor folders should be created * @param createFullPath 'True' means that all the ancestor folders should be created.
* if don't exist yet. * @param folderToSaveChunks 'True' means that the folder to create is to save upload chunks.
*/ */
public CreateRemoteFolderOperation(String remotePath, boolean createFullPath) { public CreateRemoteFolderOperation(String remotePath, boolean createFullPath, boolean folderToSaveChunks) {
mRemotePath = remotePath; mRemotePath = remotePath;
mCreateFullPath = createFullPath; mCreateFullPath = createFullPath;
mFolderToSaveChunks = folderToSaveChunks;
} }
/** /**
@ -102,8 +104,8 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
private RemoteOperationResult createFolder(OwnCloudClient client) { private RemoteOperationResult createFolder(OwnCloudClient client) {
RemoteOperationResult result; RemoteOperationResult result;
try { try {
final MkColMethod mkcol = new MkColMethod(HttpUrl.parse(client.getWebdavUri() Uri webDavUri = mFolderToSaveChunks ? client.getNewUploadsWebDavUri() : client.getNewFilesWebDavUri();
+ WebdavUtils.encodePath(mRemotePath))); final MkColMethod mkcol = new MkColMethod(HttpUrl.parse(webDavUri + WebdavUtils.encodePath(mRemotePath)));
mkcol.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS); mkcol.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
mkcol.setConnectionTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS); mkcol.setConnectionTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS);
final int status = client.executeHttpMethod(mkcol); final int status = client.executeHttpMethod(mkcol);
@ -124,7 +126,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
private RemoteOperationResult createParentFolder(String parentPath, OwnCloudClient client) { private RemoteOperationResult createParentFolder(String parentPath, OwnCloudClient client) {
RemoteOperation operation = new CreateRemoteFolderOperation(parentPath, RemoteOperation operation = new CreateRemoteFolderOperation(parentPath,
mCreateFullPath); mCreateFullPath, mFolderToSaveChunks);
return operation.execute(client); return operation.execute(client);
} }
} }

View File

@ -37,7 +37,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@ -103,7 +102,7 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
RemoteOperationResult result; RemoteOperationResult result;
int status; int status;
boolean savedFile = false; boolean savedFile = false;
mGet = new GetMethod(HttpUrl.parse(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath))); mGet = new GetMethod(HttpUrl.parse(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)));
Iterator<OnDatatransferProgressListener> it; Iterator<OnDatatransferProgressListener> it;
FileOutputStream fos = null; FileOutputStream fos = null;

View File

@ -88,7 +88,7 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
// client.setFollowRedirects(false); // client.setFollowRedirects(false);
PropfindMethod propfindMethod = new PropfindMethod( PropfindMethod propfindMethod = new PropfindMethod(
HttpUtils.stringUrlToHttpUrl(client.getNewWebDavUri() + WebdavUtils.encodePath(mPath)), HttpUtils.stringUrlToHttpUrl(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mPath)),
0, 0,
DavUtils.getAllPropset()); DavUtils.getAllPropset());
@ -115,14 +115,14 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
? new RemoteOperationResult(OK) ? new RemoteOperationResult(OK)
: new RemoteOperationResult(propfindMethod); : new RemoteOperationResult(propfindMethod);
Log_OC.d(TAG, "Existence check for " + client.getWebdavUri() + Log_OC.d(TAG, "Existence check for " + client.getOldFilesWebdavUri() +
WebdavUtils.encodePath(mPath) + " targeting for " + WebdavUtils.encodePath(mPath) + " targeting for " +
(mSuccessIfAbsent ? " absence " : " existence ") + (mSuccessIfAbsent ? " absence " : " existence ") +
"finished with HTTP status " + status + (!isSuccess(status) ? "(FAIL)" : "")); "finished with HTTP status " + status + (!isSuccess(status) ? "(FAIL)" : ""));
} catch (Exception e) { } catch (Exception e) {
result = new RemoteOperationResult(e); result = new RemoteOperationResult(e);
Log_OC.e(TAG, "Existence check for " + client.getWebdavUri() + Log_OC.e(TAG, "Existence check for " + client.getOldFilesWebdavUri() +
WebdavUtils.encodePath(mPath) + " targeting for " + WebdavUtils.encodePath(mPath) + " targeting for " +
(mSuccessIfAbsent ? " absence " : " existence ") + ": " + (mSuccessIfAbsent ? " absence " : " existence ") + ": " +
result.getLogMessage(), result.getException()); result.getLogMessage(), result.getException());

View File

@ -35,7 +35,6 @@ public class FileUtils {
public static final String PATH_SEPARATOR = "/"; public static final String PATH_SEPARATOR = "/";
public static String getParentPath(String remotePath) { public static String getParentPath(String remotePath) {
String parentPath = new File(remotePath).getParent(); String parentPath = new File(remotePath).getParent();
parentPath = parentPath.endsWith(PATH_SEPARATOR) ? parentPath : parentPath + PATH_SEPARATOR; parentPath = parentPath.endsWith(PATH_SEPARATOR) ? parentPath : parentPath + PATH_SEPARATOR;
@ -82,5 +81,4 @@ public class FileUtils {
} }
return result; return result;
} }
} }

View File

@ -109,8 +109,8 @@ public class MoveRemoteFileOperation extends RemoteOperation {
RemoteOperationResult result = null; RemoteOperationResult result = null;
try { try {
final MoveMethod move = new MoveMethod( final MoveMethod move = new MoveMethod(
HttpUrl.parse( client.getWebdavUri() + WebdavUtils.encodePath(mSrcRemotePath)), HttpUrl.parse( client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mSrcRemotePath)),
client.getWebdavUri() + WebdavUtils.encodePath(mTargetRemotePath), client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath),
mOverwrite); mOverwrite);
move.setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS); move.setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS);

View File

@ -79,7 +79,7 @@ public class ReadRemoteFileOperation extends RemoteOperation {
try { try {
// remote request // remote request
propfind = new PropfindMethod( propfind = new PropfindMethod(
HttpUrl.parse(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath)), HttpUrl.parse(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)),
DEPTH_0, DEPTH_0,
DavUtils.getAllPropset()); DavUtils.getAllPropset());

View File

@ -75,7 +75,7 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
try { try {
PropfindMethod propfindMethod = new PropfindMethod( PropfindMethod propfindMethod = new PropfindMethod(
HttpUtils.stringUrlToHttpUrl(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)), HttpUtils.stringUrlToHttpUrl(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)),
DavConstants.DEPTH_1, DavConstants.DEPTH_1,
DavUtils.getAllPropset()); DavUtils.getAllPropset());

View File

@ -48,7 +48,7 @@ import at.bitfire.dav4android.property.owncloud.OCPrivatelink;
import at.bitfire.dav4android.property.owncloud.OCSize; import at.bitfire.dav4android.property.owncloud.OCSize;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import static com.owncloud.android.lib.common.OwnCloudClient.NEW_WEBDAV_PATH_4_0; import static com.owncloud.android.lib.common.OwnCloudClient.NEW_WEBDAV_FILES_PATH_4_0;
/** /**
* Contains the data of a Remote File from a WebDavEntry * Contains the data of a Remote File from a WebDavEntry
@ -232,7 +232,7 @@ public class RemoteFile implements Parcelable, Serializable {
private static String getRemotePathFromUrl(HttpUrl url, String displayName) { private static String getRemotePathFromUrl(HttpUrl url, String displayName) {
final String pathToRemove = NEW_WEBDAV_PATH_4_0 + displayName; final String pathToRemove = NEW_WEBDAV_FILES_PATH_4_0 + displayName;
return Uri.decode(url.encodedPath()).replace(pathToRemove, ""); return Uri.decode(url.encodedPath()).replace(pathToRemove, "");
} }

View File

@ -66,7 +66,7 @@ public class RemoveRemoteFileOperation extends RemoteOperation {
try { try {
DeleteMethod deleteMethod = new DeleteMethod( DeleteMethod deleteMethod = new DeleteMethod(
HttpUtils.stringUrlToHttpUrl(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)) HttpUtils.stringUrlToHttpUrl(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath))
); );
int status = client.executeHttpMethod(deleteMethod); int status = client.executeHttpMethod(deleteMethod);

View File

@ -106,9 +106,9 @@ public class RenameRemoteFileOperation extends RemoteOperation {
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE); return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
} }
final MoveMethod move = new MoveMethod(HttpUrl.parse(client.getWebdavUri() + final MoveMethod move = new MoveMethod(HttpUrl.parse(client.getNewFilesWebDavUri() +
WebdavUtils.encodePath(mOldRemotePath)), WebdavUtils.encodePath(mOldRemotePath)),
client.getWebdavUri() + WebdavUtils.encodePath(mNewRemotePath), false); client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mNewRemotePath), false);
move.setReadTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS); move.setReadTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS);
move.setConnectionTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS); move.setConnectionTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS);

View File

@ -89,7 +89,7 @@ public class UploadRemoteFileOperation extends RemoteOperation {
try { try {
mPutMethod = new PutMethod( mPutMethod = new PutMethod(
HttpUtils.stringUrlToHttpUrl(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath))); HttpUtils.stringUrlToHttpUrl(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)));
mPutMethod.setRetryOnConnectionFailure(false); mPutMethod.setRetryOnConnectionFailure(false);

View File

@ -89,7 +89,7 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation {
try { try {
PropfindMethod propfindMethod = new PropfindMethod( PropfindMethod propfindMethod = new PropfindMethod(
HttpUtils.stringUrlToHttpUrl(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)), HttpUtils.stringUrlToHttpUrl(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)),
DEPTH_0, DEPTH_0,
DavUtils.getQuotaPropSet() DavUtils.getQuotaPropSet()
); );