怎么上载大文件服务器使用改装分段

0

的问题

我必须请求其工作良好的邮递员:

enter image description here

和我试图把它改造。 在一般性文件的大小会>500兆。 我没有这样的传方法:

fun uploadFile(file:File) {

        val client = OkHttpClient().newBuilder()
            .build()
        val mediaType: MediaType? = "text/plain".toMediaTypeOrNull()
        val body: RequestBody = MultipartBody.Builder().setType(MultipartBody.FORM)
            .addFormDataPart(
                "data", file.name,
                file.asRequestBody()
            )
            .build()
        val request: Request = Request.Builder()
            .url("https://..../upload.php")
            .method("POST", body)
            .build()
        val response: okhttp3.Response = client.newCall(request).execute()

       println(response.message)
    }

但是我需要的文件上传。 我可以创建的临时文件,用这种方式:

val path = requireContext().cacheDir
val file = File.createTempFile(
    name ?: "",
    fileUri.lastPathSegment,
    path
)
val os = FileOutputStream(file)
os.write(string)
os.close()

但是我通常会收到 outOfMemoryException. 我也加入AndroidManifest.xml 堆param:

android:largeHeap="true"

但是,它没有帮助我的人在临时文件。 我不知道邮递员怎么上传文件,但在一般情况下,我设法上传他的帮助的文件与大约600mb. 我还可以减少所选择的文件与大块:

val data = result.data
data?.let {
      val fileUri = data.data
      var name: String? = null
      var size: Long? = null
      fileUri.let { returnUri ->
            contentResolver?.query(returnUri!!, null, null, null, null)
      }?.use { cursor ->
            val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
            val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)

            cursor.moveToFirst()
            name = cursor.getString(nameIndex)
            size = cursor.getLong(sizeIndex)
       }


val inputStream: InputStream? = fileUri?.let { it1 ->
    contentResolver.openInputStream(
        it1
    )
}

val fileData = inputStream?.readBytes()
val mimeType = fileUri.let { returnUri ->
returnUri.let { retUri ->
    if (retUri != null) {
           contentResolver.getType(retUri)
    }
}
}


fileData?.let {
       val MAX_SUB_SIZE = 4194304 // 4*1024*1024 == 4MB
       var start = 0 // From 0
       var end = MAX_SUB_SIZE // To MAX_SUB_SIZE bytes
       var subData: ByteArray // 4MB Sized Array

       val max = fileData.size
       if (max > 0) {
           while (end < max) {
                subData = fileData.copyOfRange(start, end)
                start = end
                end += MAX_SUB_SIZE
                if (end >= max) {
                    end = max
                }
                                
                println("file handling" + subData.size)



        }
     end-- // To avoid a padded zero
     subData = fileData.copyOfRange(start, end)
     println("file handling" + subData.size)
     }
   }
}

所有行动将在:

 private val filesReceiver =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {

             }
         }

所以我不会有任何文件路径在正常的方式。 无论如何我觉得我做错了什么。

更新

现在我有这样的文件上传输入流:

 private fun doSomeNetworkStuff(file:InputStream, name:String) {
        GlobalScope.launch(Dispatchers.IO) {
            val client = OkHttpClient()
                .newBuilder()
                .protocols(listOf(Protocol.HTTP_1_1))
                .connectTimeout(10, TimeUnit.MINUTES)
                .readTimeout(10, TimeUnit.MINUTES)
                .build()
            val mediaType: MediaType? = "text/plain".toMediaTypeOrNull()
            val body: RequestBody = MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart(
                    "data", name,
                    file.readBytes().toRequestBody(mediaType)
                )
                .build()
            val request: Request = Request.Builder()
                .url("https://.../upload.php")
                .method("POST", body)
                .build()

            val response: Response = client.newCall(request).execute()

            println(response.body)
        }
    }

和接收这样的错误:

java.lang.OutOfMemoryError: Failed to allocate a 173410912 byte allocation with 25165824 free bytes and 89MB until OOM, max allowed footprint 199761800, growth limit 268435456

但我可以上传这个代码文件中有大约90mb

android
2021-11-24 05:56:49
2

最好的答案

1

该分段改造的东西有一个成员,需要一个Uri请求的身体。

你试图用一个文件的实例。

2021-11-24 07:53:27

可以请你澄清其工作人员,因为我看到了这个问题 stackoverflow.com/questions/34562950/... 和使用的工作人员从他身上
Andrew

你有没有看到somerhing一uri吗? 在输入流?
blackapps

谷歌inputstreamrequestbody.
blackapps

我试图使用输入流的如你所说,但是字节列使用情况,以及我上传的方法失败,文件大小>90mb,你可以查我的问题upd pls?
Andrew

我只能说使用uri。 看来你是不这样做。 你不应该用一个字阵列。 或输入流。 呃...不是这样的。
blackapps

也许你可以添加一些样品,因为我没有这样理解你,也许你知道这是我的吗?) 因为我没有找到任何提及有关uri requestbody
Andrew

0

你有没有设置登录在loggingInterceptor或restadapter?
如果是的然后试着把它设置没有。

2021-11-24 06:14:28

它已经完成了
Andrew

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................