android - 如何从 onActivityResult 上传选定的文件改造?
问题描述
我正在尝试通过改造将文件上传到远程服务器。在邮递员中,我是这样做的:
我做了这样的接口方法:
@Multipart
@POST("user/upload")
fun uploadFile(@Part("upload_doc") file: RequestBody): Call<EditResponse>
我将从 onActivityResult 发送选定的文件:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == AppCompatActivity.RESULT_OK) {
if (data != null) {
val file = File(getRealPathFromURI(data.data!!)!!)
if (file.exists()) {
val uploadFile = MultipartBody.Part.createFormData("upload_doc", file.name, file.asRequestBody())
val requestBody: RequestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(uploadFile)
.build()
}
}
}
}
问题与获取文件路径有关。我想你知道这是一个问题。我尝试使用这种方法:
fun getFile(documentUri: Uri): File {
val inputStream = context?.contentResolver?.openInputStream(documentUri)
var file: File
inputStream.use { input ->
file =
File(context?.cacheDir, System.currentTimeMillis().toString() + ".pdf")
FileOutputStream(file).use { output ->
val buffer =
ByteArray(4 * 1024) // or other buffer size
var read: Int = -1
while (input?.read(buffer).also {
if (it != null) {
read = it
}
} != -1) {
output.write(buffer, 0, read)
}
output.flush()
}
}
return file
}
但是服务器返回给我说我发送了错误的文件类型。所以我认为我有两个问题:
- 获取错误的文件路径
- 为所有文件类型发送正常的多部分文件,而不仅仅是发送 pdf
我想也许有些问题与这个文件转换线有关:
val uploadFile = MultipartBody.Part.createFormData("upload_doc", file.name, file.asRequestBody())
也许有人知道如何解决这个问题?
解决方案
更改您的代码如下:
fun updateProfile(
image: File?,
firstName: String?,
userName: String)
{
var picture: MultipartBody.Part? = null
try {
val requestFile: RequestBody? =
image!!.asRequestBody("image/*".toMediaTypeOrNull())
picture = MultipartBody.Part.createFormData("picture",
image!!.name, requestFile!!)
} catch (ex: Exception) {
}
val userName: RequestBody = userName
.toRequestBody(MultipartBody.FORM)
val name: RequestBody = firstName!!
.toRequestBody(MultipartBody.FORM)
File file = new File(mediaPath);
File file1 = new File(mediaPath1);
// Parsing any Media type file
RequestBody requestBody1 =
RequestBody.create(MediaType.parse("*/*"),file);
RequestBody requestBody2 =
RequestBody.create(MediaType.parse("*/*"),file1);
MultipartBody.Part fileToUpload1 =
MultipartBody.Part.createFormData("file1", file.getName(),
requestBody1);
MultipartBody.Part fileToUpload2 =
MultipartBody.Part.createFormData("file2", file1.getName(),
requestBody2);
postProfile(image,name,username,fileToUpload1 ,fileToUpload2)
}
并将您的改造电话更改为:
@Headers("Accept: application/json")
@Multipart
@POST(yourEndPoint)
fun postProfile(
@Part picture: MultipartBody.Part?,
@Part("name") name: RequestBody?,
@Part("user_name") user_name: RequestBody,
@Part filea: MultipartBody.Part?,
@Part fileb: MultipartBody.Part?
): Deferred<Response<yourClass>>
推荐阅读
- ruby - 可变 Ruby - Launchschool 的练习
- ios - 仅从 firebase 加载更新的文档?
- python - xlwt.Style.EasyXFCallerError:“填充”部分未知
- amazon-web-services - AWS GLUE 导入 xls/xlsx 文件
- kotlin - 适配器中的几个列表
- javascript - 我想在单击按钮时下载项目目录中特定路径中的 excel 文件或作为链接标签
- angular - 如何将 ngModelChange 与管道一起使用
- c# - 函数 FindByNameAsync() 的 UserManager 值第一次为空
- arrays - 在查找用户名时字典名称不起作用的数组上的查找函数
- android - 我可以在没有用户交互的情况下在 Android 设备上获取 Firebase/Google UID 吗?