对于有 inputStream 的用户,您可以使用 Multipart 上传 inputStream。
@Multipart
@POST("pictures")
suspend fun uploadPicture(
@Part part: MultipartBody.Part
): NetworkPicture
然后在你的存储库类中:
suspend fun upload(inputStream: InputStream) {
val part = MultipartBody.Part.createFormData(
"pic", "myPic", RequestBody.create(
MediaType.parse("image/*"),
inputStream.readBytes()
)
)
uploadPicture(part)
}
如果您的后端不允许多部分,您可以将输入流转换为字节并将字节数组作为请求正文发送,如下所示。
// In your service
@PUT
suspend fun s3Upload(
@Header("Content-Type") mime: String,
@Url uploadUrl: String,
@Body body: RequestBody
)
// In your repository
val body = RequestBody.create(MediaType.parse("application/octet"), inputStream.readBytes())
networkService.s3Upload(mime, url, body)
要获得输入流,您可以这样做。
在您的片段或活动中,您需要创建一个返回InputStream 的图像选择器。 InputStream 的优势在于它可以用于云上的文件,例如 google drive 和 dropbox。
通过View.OnClickListener 或onOptionsItemSelected 致电pickImagesLauncher.launch("image/*")。 (见Activity Result APIs)。
private val pickImagesLauncher =
registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let {
val stream = contentResolver.openInputStream(it)
itemViewModel.uploadPicture(stream)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
btn.setOnClickListener {
pickImagesLauncher.launch("image/*")
}
}