@@ -23,6 +23,7 @@ import okhttp3.RequestBody.Companion.toRequestBody
23
23
import java.io.BufferedInputStream
24
24
import java.io.BufferedReader
25
25
import java.io.File
26
+ import java.io.RandomAccessFile
26
27
import java.io.IOException
27
28
import java.net.CookieManager
28
29
import java.net.CookiePolicy
@@ -340,40 +341,32 @@ class Client @JvmOverloads constructor(
340
341
)
341
342
}
342
343
343
- val input = file.inputStream().buffered( )
344
+ val input = RandomAccessFile(file, "r" )
344
345
val buffer = ByteArray(CHUNK_SIZE)
345
346
var offset = 0L
346
347
var result: Map< *, *>? = null
347
348
348
349
if (idParamName?.isNotEmpty() == true && params[idParamName] != "unique()") {
349
350
// 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)
362
360
}
363
361
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
+
373
366
params[paramName] = MultipartBody.Part.createFormData(
374
367
paramName,
375
368
file.name,
376
- it .toRequestBody()
369
+ buffer .toRequestBody()
377
370
)
378
371
379
372
headers["Content-Range"] =
@@ -388,14 +381,16 @@ class Client @JvmOverloads constructor(
388
381
)
389
382
390
383
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
+ )
399
394
}
400
395
401
396
return converter(result as Map<String , Any >)
0 commit comments