You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
val progress:Float= (totalBytesRead / contentLength().toFloat())
253
+
onUploadCallback(progress)
254
+
}
255
+
256
+
companionobject {
257
+
privateconstvalDEFAULT_BUFFER_SIZE=4096L
258
+
}
259
+
}
260
+
```
261
+
262
+
В качестве входящих параметров для класса нужно передать информацию о файле, вторым параметром передаем callback для отображения прогресса загрузки на ui. Структура FileSource:
263
+
264
+
```kotlin
265
+
importkotlinx.io.RawSource
266
+
267
+
data classFileSource(
268
+
valfileName:String,
269
+
valsource:RawSource,
270
+
valfileSize:Long,
271
+
)
272
+
```
273
+
Теперь когда готовы основные структуры для загрузки файла на сервер, давайте создадим интерфейс для нашего API:
274
+
275
+
```kotlin
276
+
importokhttp3.MultipartBody
277
+
importretrofit2.Response
278
+
importretrofit2.http.Multipart
279
+
importretrofit2.http.POST
280
+
importretrofit2.http.Part
281
+
282
+
interfaceUploadApi {
283
+
@Multipart
284
+
@POST("/api/images")
285
+
suspendfunuploadImage(
286
+
@Part image:MultipartBody.Part,
287
+
): Response<SuccessDto>
288
+
}
289
+
```
290
+
Для обозначения, что в теле запроса содержится multi-part на него нужно повесить аннотацию '@Multipart', а для параметра содержащий его '@Part'. При вызове данного запроса в репозитории необходимо будет создать MultipartBody.Part, вызывом createFormData:
291
+
292
+
```kotlin
293
+
...
294
+
suspendfunuploadImage(
295
+
fileSource:FileSource,
296
+
onUploadCallback: (Float) ->Unit,
297
+
): ImageUploadResult {
298
+
return uploadApi.uploadImage(
299
+
image =MultipartBody.Part.createFormData(
300
+
name ="image", // имя Multipart файла указанное в api бекенда
301
+
filename = fileSource.fileName, // Имя файла передается в заголовке form-data
302
+
body =FileSourceRequestBody(
303
+
fileSource = fileSource,
304
+
onUploadCallback = onUploadCallback
305
+
)
306
+
)
307
+
)
308
+
}.toDomain()
309
+
}
310
+
...
311
+
```
312
+
172
313
### application/octet-stream
173
314
174
315
Данный подход используется довольно редко, но все же используется. Для данного типа запроса нет возможности передать несколько параметров или файлов, можно отправлять файл, притом только один. Для реализации подхода необходимо создать класс, унаследованный от `WriteChannelContent` ([ссылка на класс](https://www.mvndoc.com/c/io.ktor/ktor-http-iosarm64/io/ktor/http/content/OutgoingContent.WriteChannelContent.html)). Пример кода:
0 commit comments