android - 如何在 Retrofit 2 Kotlin 的 post 参数中发送任何类型的文件?
问题描述
让我分享一些我为在请求中发送图像文件而实现的代码。
以下是我的api请求功能:
@Multipart
@POST("api/order/order_create")
fun createOrder(
@Header("Authorization") authorization: String?,
@Part("category_id") categoryId: RequestBody?,
@Part("size") size: RequestBody?,
@Part("narration") narration: RequestBody?,
@Part("ref_picture") file: RequestBody?
): Call<OrderCreateResponse>
下面是我通过发送必要参数调用 api 的代码:
var fbody = RequestBody.create(MediaType.parse("image/*"), imageFile)
var size = RequestBody.create(MediaType.parse("text/plain"), et_custom_order_size.text.toString())
var catId = RequestBody.create(MediaType.parse("text/plain"), selectedID.toString())
var narration = RequestBody.create(MediaType.parse("text/plain"),et_custom_order_narration.text.toString())
val orderCreateAPI = apiService!!.createOrder(complexPreferences?.getPref("token", null), catId,size,narration,fbody)
这里 imageFile 是通过以下方式获取的,
imageFile = File(Global.getRealPathFromURI(activity!!, imageUri!!))
使用以下函数获取真实路径,
fun getRealPathFromURI(context: Context, contentUri: Uri): String {
var cursor: Cursor? = null
try {
val proj = arrayOf(MediaStore.Images.Media.DATA)
cursor = context.contentResolver.query(contentUri, proj, null, null, null)
val column_index = cursor!!.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
cursor.moveToFirst()
return cursor.getString(column_index)
} catch (e: Exception) {
Log.e(TAG, "getRealPathFromURI Exception : " + e.toString())
return ""
} finally {
if (cursor != null) {
cursor.close()
}
}
}
通过上述方式发送图像,我无法发送它!请指导我。提前致谢。
解决方案
@Multipart
@POST("register")
Observable<SignInResponse> signUp(@Part("name") RequestBody name, @Part MultipartBody.Part fileToUpload);
然后将图像文件作为 MultipartBody.Part 变量传递
// image as file
var body: MultipartBody.Part? = null
if (!profileImagePath.isNullOrBlank()) {
val file = File(profileImagePath)
val inputStream = contentResolver.openInputStream(Uri.fromFile(file))
val requestFile = RequestBody.create(MediaType.parse("image/jpeg"), getBytes(inputStream))
body = MultipartBody.Part.createFormData("image", file.name, requestFile)
Log.d("nama file e cuk", file.name)
}
最后一件事你可以制作 RequestBody var
RequestBody.create(MediaType.parse("text/plain"), user_full_name)
最后发送请求:)
推荐阅读
- javascript - 圆形包装中的文本路径无法正确缩放
- opengl-es - OpenGL ES 深度帧缓冲 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
- r - 如何使用ggplot定义分组因子中的刻度数
- here-api - Here Maps - Datalens API - 更新位置抛出无效参数错误
- batch-file - 我做错了什么?我知道这可能很简单
- go - 将字段名称反映到特定接口
- python - 通过切换列名来移动熊猫系列值?
- javascript - 容器对象的引用相等
- lua - 关于我正在从事的“Story Roblox Creator Challenge”项目的建议
- asp.net-core - 托管 asp.core:如何用 AddApplicationPart 替换过时的 RazorViewEngineOptions.CompilationCallback?