【发布时间】:2020-12-16 06:54:46
【问题描述】:
我正在尝试通过改造将文件上传到远程服务器。在 Postman 中,我是这样做的:
我做了这样的接口方法:
@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())
也许有人知道如何解决这个问题?
【问题讨论】:
-
查看 RequestBodyInputStream 并为获取的 uri 使用输入流。
-
@blackapps,也许你可以举一些小例子,因为经过一番寻找我无法弄清楚解决方案?
-
我自己没用过。对不起。
标签: android retrofit2 multipart