을 업로드하는 방법은 큰 파일을 사용하여 서버 개조 multipart

0

질문

내가 있는 요청에서 잘 작동 우편 배달

enter image description here

나는 그것을 만들려고 노력으로 개조. 에서 일반적인 파일 크기가 될 것이다>500MB 니다. 나는 같은 업로드 방법:

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"

하지만 그것은 도움이 되지 않았 모든 날 동안 임시 파일을 만들. 나도 몰라 어떻게 우편 배달부가 파일을 업로드하지만,일반적으로 관리하여 업로드 그의 도움으로 파일 크기 약 600 메가바이트. 수도 잘 선택한 파일에 덩어리:

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

             }
         }

그래서 나는 모든이 없 파일 경로에서 정상적인 방법입니다. 어쨌든 난 생각하는 내가 뭔가 잘못입니다.

업데이트

지금 나는 같은 파일을 업로드에서 inputStream:

 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

하지만 나는 업로드 할 수 있습니와 함께 이 코드를 가진 파일의 크기는 약 90 메가바이트

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

최고의 응답

1

개조한 다중 재료는 구성원이 사용하는 Uri 에 대한 요청을 몸입니다.

당신이 사용하려고 하나의 파일에 대한 인스턴스입니다.

2021-11-24 07:53:27

을 명확히 할 수 pls 는 직원,기 때문에 이 질문 stackoverflow.com/questions/34562950/... 및 사용한 직원이 그에게서
Andrew

당신이 볼 somerhing 는 uri 가? 에 대한 입력 스트림?
blackapps

구글에 대한 inputstreamrequestbody.
blackapps

내가 사용하려 입력 스트림으로 당신은 말했다,하지만을 가진 바이트 배열을 사용하고 나 업로드하는 방법에서 실패하는 파일의 크기>90 메가바이트,확인할 수 있습니다 제 질문이트 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ý
..................................................................................................................