UploadDemo icon indicating copy to clipboard operation
UploadDemo copied to clipboard

上传文件的时候需要再加别的参数要怎么操作?直接params添加不行

Open TianGuisen opened this issue 4 years ago • 3 comments

TianGuisen avatar Mar 30 '21 10:03 TianGuisen

这样就可以传其他参数了

                            val params = ArrayMap<String, Any>()
                            params["file"] = file
                            params["LoadOnSubscribe"] = loadOnSubscribe
                            params["key"] = value
class FileRequestBodyConverter : Converter<ArrayMap<String, Any>, RequestBody> {
    //进度发射器
    var uploadOnSubscribe: LoadOnSubscribe? = null

    @Throws(IOException::class)
    override fun convert(params: ArrayMap<String, Any>): RequestBody {
        uploadOnSubscribe = params["LoadOnSubscribe"] as LoadOnSubscribe?
        val builder = MultipartBody.Builder().setType(MultipartBody.FORM)
        params.forEach {
            if (it.key == "LoadOnSubscribe") {
                uploadOnSubscribe = it.value as LoadOnSubscribe?
                return@forEach
            } else if (it.key == "fileList") {
                filesToMultipartBody(builder, it.value as List<File>)
                return@forEach
            } else if (it.key == "file") {
                fileToMultipartBody(builder, it.value as File)
                return@forEach
            } else {
                builder.addFormDataPart(it.key, it.value.toString())
            }
        }
        return builder.build()
    }

    /**
     * 用于把 File集合 或者 File路径集合 转化成 MultipartBody
     *
     * @param <T>   泛型(File 或者 String)
     * @param files File列表或者 File 路径列表
     * @return MultipartBody(retrofit 多文件文件上传)
    </T> */
    @Synchronized
    fun filesToMultipartBody(builder: MultipartBody.Builder, files: List<File>): MultipartBody.Builder {
        var sumLeng = 0L
        for (file in files) {
            sumLeng += file.length()
            // TODO 为了简单起见,没有判断file的类型
            val requestBody = FileProgressRequestBody(file, "multipart/form-data", uploadOnSubscribe)
            builder.addFormDataPart("file", file.name, requestBody)
        }
        uploadOnSubscribe!!.setmSumLength(sumLeng)
        return builder
    }

    @Synchronized
    fun fileToMultipartBody(builder: MultipartBody.Builder, file: File): MultipartBody.Builder {
        var sumLeng = 0L
        sumLeng += file.length()
        // TODO 为了简单起见,没有判断file的类型
        val requestBody = FileProgressRequestBody(file, "multipart/form-data", uploadOnSubscribe)
        builder.addFormDataPart("file", file.name, requestBody)
        uploadOnSubscribe!!.setmSumLength(sumLeng)
        return builder
    }
}

TianGuisen avatar Mar 31 '21 08:03 TianGuisen

看了你贴的代码 没有问题啊 我在项目中也是这样玩儿的,一直ok

fy310518 avatar Apr 03 '21 03:04 fy310518

你当前的代码缺少大概这一块,导致只处理了LoadOnSubscribe和file相关的key,导致如果想文件和其他数据一起传的话,其他数据传不上去。比如传1个文件加一个name=asd,name=asd是不在请求里的。

else {
                builder.addFormDataPart(it.key, it.value.toString())
            }

TianGuisen avatar Apr 05 '21 05:04 TianGuisen