kotlin 多文件上传

在apifox中案例应用如下

img


fun post(fileList: MutableList<File>) {
         val client = OkHttpClient.Builder()
            .connectTimeout(60,TimeUnit.SECONDS)
            .readTimeout(60,TimeUnit.SECONDS)
            .build()
        // 创建 MultipartBody.Builder
        val requestBodyBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)

        // 添加文件参数
        for (file in fileList) {
            Log.d("file123", file.toString())
            requestBodyBuilder.addFormDataPart("file", file.name, file.asRequestBody("application/pdf".toMediaType()))
        }

        val requestBody = requestBodyBuilder.build()
        val request = Request.Builder()
            .url(baseUrl)
            .post(requestBody)
            .build()
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.d("file123",e.message.toString())
            }
            override fun onResponse(call: Call, response: Response) {
                val res = response.body?.string()
                Log.d("file123",res.toString())
            }
        })
    }

以上就是我的请求方法,但是遇到了一些问题

  1. 当OkHttpClient设置为15秒左右,在Android studio并没有到达15s,却打印出timeout的问题(也就是请求失败)
  2. 当OkHttpClient设置为60秒左右,在Android studio并没有到达15s,却打印出Connection Reset的问题(也就是请求失败)

在apifox是运行成功的,但是android是请求失败的,后台日志显示一部分成功,但是莫名中断了。(提示:当文件为一个的时候是成功的)

基于new bing部分指引作答:
在Kotlin中进行多文件上传,您可以使用以下步骤:

  1. 在您的Kotlin项目中添加一个HTTP客户端库,如OkHttp或HttpClient等。这些库将帮助您进行网络请求。

  2. 创建一个HTTP POST请求,并设置正确的URL和请求头。

  3. 使用MultipartBody.Builder来构建请求主体,它可以包含多个文件。

  4. 遍历要上传的文件列表,逐个将文件添加到MultipartBody中。

  5. 发起HTTP请求,并处理响应。

下面是一个示例代码片段,演示了如何进行多文件上传:

import okhttp3.MediaType
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import java.io.File
import java.io.IOException

fun uploadFiles(url: String, files: List<File>) {
    val client = OkHttpClient()

    val requestBody = MultipartBody.Builder()
        .setType(MultipartBody.FORM)

    for (file in files) {
        val mediaType = MediaType.parse("application/octet-stream")
        val fileRequestBody = RequestBody.create(mediaType, file)
        requestBody.addFormDataPart("file", file.name, fileRequestBody)
    }

    val request = Request.Builder()
        .url(url)
        .post(requestBody.build())
        .build()

    try {
        val response = client.newCall(request).execute()
        if (response.isSuccessful) {
            // 处理成功上传的响应
            println("文件上传成功")
        } else {
            // 处理上传失败的响应
            println("文件上传失败")
        }
    } catch (e: IOException) {
        e.printStackTrace()
        // 处理异常情况
        println("文件上传发生错误")
    }
}

请注意,上述代码仅涉及文件上传的部分,您需要根据自己的项目实际情况进行适当的修改和调整。此外,还需要确保您已添加相应的依赖库并正确配置网络权限。

希望对您有所帮助!

建议多次请求,这样一次请求添加多个body,太长了容易出问题

当前代码放到线程中执行,或者改为异步发布网络请求。