首页 > 解决方案 > 如何从 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
    }

但是服务器返回给我说我发送了错误的文件类型。所以我认为我有两个问题:

  1. 获取错误的文件路径
  2. 为所有文件类型发送正常的多部分文件,而不仅仅是发送 pdf

我想也许有些问题与这个文件转换线有关:

val uploadFile = MultipartBody.Part.createFormData("upload_doc", file.name, file.asRequestBody())

也许有人知道如何解决这个问题?

标签: androidretrofit2multipart

解决方案


更改您的代码如下:

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>>

推荐阅读