Skip to content

Commit 385d943

Browse files
committed
Fix random access read
1 parent 8166a52 commit 385d943

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

templates/android/library/src/main/java/io/appwrite/Client.kt.twig

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import okhttp3.RequestBody.Companion.toRequestBody
2323
import java.io.BufferedInputStream
2424
import java.io.BufferedReader
2525
import java.io.File
26+
import java.io.RandomAccessFile
2627
import java.io.IOException
2728
import java.net.CookieManager
2829
import java.net.CookiePolicy
@@ -340,40 +341,32 @@ class Client @JvmOverloads constructor(
340341
)
341342
}
342343

343-
val input = file.inputStream().buffered()
344+
val input = RandomAccessFile(file, "r")
344345
val buffer = ByteArray(CHUNK_SIZE)
345346
var offset = 0L
346347
var result: Map<*, *>? = null
347348

348349
if (idParamName?.isNotEmpty() == true && params[idParamName] != "unique()") {
349350
// Make a request to check if a file already exists
350-
try {
351-
val current = call(
352-
method = "GET",
353-
path = "$path/$params[idParamName]",
354-
headers = headers,
355-
params = emptyMap(),
356-
responseType = Map::class.java,
357-
)
358-
val chunksUploaded = current["chunksUploaded"] as Long
359-
offset = size.coerceAtMost(chunksUploaded * CHUNK_SIZE)
360-
} catch (ex: {{spec.title | caseUcfirst}}Exception) {
361-
}
351+
val current = call(
352+
method = "GET",
353+
path = "$path/${params[idParamName]}",
354+
headers = headers,
355+
params = emptyMap(),
356+
responseType = Map::class.java,
357+
)
358+
val chunksUploaded = current["chunksUploaded"] as Long
359+
offset = (chunksUploaded * CHUNK_SIZE).coerceAtMost(size)
362360
}
363361

364-
generateSequence {
365-
val readBytes = input.read(buffer, offset.toInt(), CHUNK_SIZE)
366-
if (readBytes >= 0) {
367-
buffer.copyOf(readBytes)
368-
} else {
369-
input.close()
370-
null
371-
}
372-
}.forEach {
362+
while (offset < size) {
363+
input.seek(offset)
364+
input.read(buffer)
365+
373366
params[paramName] = MultipartBody.Part.createFormData(
374367
paramName,
375368
file.name,
376-
it.toRequestBody()
369+
buffer.toRequestBody()
377370
)
378371

379372
headers["Content-Range"] =
@@ -388,14 +381,16 @@ class Client @JvmOverloads constructor(
388381
)
389382

390383
offset += CHUNK_SIZE
391-
headers["x-{{ spec.title | caseLower }}-id"] = result!!["\$id"].toString()
392-
onProgress?.invoke(UploadProgress(
393-
id = result!!["\$id"].toString(),
394-
progress = offset.coerceAtMost(size).toDouble()/size * 100,
395-
sizeUploaded = offset.coerceAtMost(size),
396-
chunksTotal = result!!["chunksTotal"].toString().toInt(),
397-
chunksUploaded = result!!["chunksUploaded"].toString().toInt(),
398-
))
384+
headers["x-appwrite-id"] = result!!["\$id"].toString()
385+
onProgress?.invoke(
386+
UploadProgress(
387+
id = result!!["\$id"].toString(),
388+
progress = offset.coerceAtMost(size).toDouble() / size * 100,
389+
sizeUploaded = offset.coerceAtMost(size),
390+
chunksTotal = result!!["chunksTotal"].toString().toInt(),
391+
chunksUploaded = result!!["chunksUploaded"].toString().toInt(),
392+
)
393+
)
399394
}
400395

401396
return converter(result as Map<String, Any>)

0 commit comments

Comments
 (0)