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

Upload chunks

This commit is contained in:
davigonz 2018-06-28 13:57:48 +02:00
parent b99723205b
commit 0b9a79491f
4 changed files with 43 additions and 9 deletions

View File

@ -24,8 +24,11 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import android.util.Log;
import com.owncloud.android.lib.common.utils.Log_OC;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.util.Iterator; import java.util.Iterator;
@ -33,9 +36,14 @@ import java.util.Iterator;
import okhttp3.MediaType; import okhttp3.MediaType;
import okio.BufferedSink; import okio.BufferedSink;
/**
* A Request body that represents a file chunk and include information about the progress when uploading it
*
* @author David González Verdugo
*/
public class ChunkFromFileRequestBody extends FileRequestBody { public class ChunkFromFileRequestBody extends FileRequestBody {
private static final String TAG = ChunkFromFileChannelRequestEntity.class.getSimpleName(); private static final String TAG = ChunkFromFileRequestBody.class.getSimpleName();
//private final File mFile; //private final File mFile;
private final FileChannel mChannel; private final FileChannel mChannel;
@ -58,6 +66,10 @@ public class ChunkFromFileRequestBody extends FileRequestBody {
mTransferred = 0; mTransferred = 0;
} }
@Override
public long contentLength() {
return mChunkSize;
}
@Override @Override
public void writeTo(BufferedSink sink) { public void writeTo(BufferedSink sink) {
@ -70,8 +82,19 @@ public class ChunkFromFileRequestBody extends FileRequestBody {
if (size == 0) size = -1; if (size == 0) size = -1;
long maxCount = Math.min(mOffset + mChunkSize, mChannel.size()); long maxCount = Math.min(mOffset + mChunkSize, mChannel.size());
while (mChannel.position() < maxCount) { while (mChannel.position() < maxCount) {
Log_OC.d(TAG, "Sink buffer size: " + sink.buffer().size());
readCount = mChannel.read(mBuffer); readCount = mChannel.read(mBuffer);
sink.write(mBuffer.array(), 0 ,readCount);
Log_OC.d(TAG, "Read " + readCount + " bytes from file channel to " + mBuffer.toString());
sink.buffer().write(mBuffer.array(), 0 ,readCount);
sink.flush();
Log_OC.d(TAG, "Write " + readCount + " bytes to sink buffer with size " + sink.buffer().size());
mBuffer.clear(); mBuffer.clear();
if (mTransferred < maxCount) { // condition to avoid accumulate progress for repeated chunks if (mTransferred < maxCount) { // condition to avoid accumulate progress for repeated chunks
mTransferred += readCount; mTransferred += readCount;
@ -84,9 +107,11 @@ public class ChunkFromFileRequestBody extends FileRequestBody {
} }
} }
sink.flush(); Log.d(TAG, "Chunk with size " + mChunkSize + " written in request body");
} catch (IOException io) { } catch (Exception exception) {
Log.e(TAG, exception.toString());
// // any read problem will be handled as if the file is not there // // any read problem will be handled as if the file is not there
// if (io instanceof FileNotFoundException) { // if (io instanceof FileNotFoundException) {
// throw io; // throw io;

View File

@ -24,6 +24,10 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import android.util.Log;
import com.owncloud.android.lib.common.utils.Log_OC;
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
@ -43,6 +47,8 @@ import okio.Source;
*/ */
public class FileRequestBody extends RequestBody implements ProgressiveDataTransferer { public class FileRequestBody extends RequestBody implements ProgressiveDataTransferer {
private static final String TAG = FileRequestBody.class.getSimpleName();
protected File mFile; protected File mFile;
private MediaType mContentType; private MediaType mContentType;
Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<>(); Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<>();
@ -68,6 +74,7 @@ public class FileRequestBody extends RequestBody implements ProgressiveDataTrans
Iterator<OnDatatransferProgressListener> it; Iterator<OnDatatransferProgressListener> it;
try { try {
source = Okio.source(mFile); source = Okio.source(mFile);
long transferred = 0; long transferred = 0;
long read; long read;
@ -82,6 +89,9 @@ public class FileRequestBody extends RequestBody implements ProgressiveDataTrans
} }
} }
Log.d(TAG, "File with name " + mFile.getName() + " and size " + mFile.length() +
" written in request body");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -106,11 +106,10 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
if (mRequiredEtag != null && mRequiredEtag.length() > 0) { if (mRequiredEtag != null && mRequiredEtag.length() > 0) {
mPutMethod.addRequestHeader(IF_MATCH_HEADER, "\"" + mRequiredEtag + "\""); mPutMethod.addRequestHeader(IF_MATCH_HEADER, "\"" + mRequiredEtag + "\"");
} }
// mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER);
// mPutMethod.addRequestHeader(OC_CHUNK_SIZE_HEADER, chunkSizeStr);
mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, totalLengthStr); mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, totalLengthStr);
mPutMethod.addRequestHeader(OC_CHUNK_X_OC_MTIME_HEADER, mFileLastModifTimestamp); // mPutMethod.addRequestHeader(OC_CHUNK_X_OC_MTIME_HEADER, mFileLastModifTimestamp);
// ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset); // ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset);
// mPutMethod.setRequestEntity(mEntity); // mPutMethod.setRequestEntity(mEntity);

View File

@ -77,7 +77,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
*/ */
@Override @Override
protected RemoteOperationResult run(OwnCloudClient client) { protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null; RemoteOperationResult result;
OwnCloudVersion version = client.getOwnCloudVersion(); OwnCloudVersion version = client.getOwnCloudVersion();
boolean versionWithForbiddenChars = boolean versionWithForbiddenChars =
(version != null && version.isVersionWithForbiddenCharacters()); (version != null && version.isVersionWithForbiddenCharacters());