कैसे करने के लिए बड़ी फाइल अपलोड करने के लिए सर्वर का उपयोग कर पुराना वापस बहुखण्डीय

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 ढेर परम:

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

             }
         }

तो मैं नहीं होगा किसी भी फ़ाइल पथ में सामान्य तरीका है । वैसे भी मुझे लगता है कि मैंने कुछ गलत किया है.

अद्यतन

अभी मैं इस तरह के फाइल अपलोड करने से 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

लेकिन मैं अपलोड कर सकते हैं इस कोड के साथ फ़ाइल के आकार के बारे में 90mb

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

सबसे अच्छा जवाब

1

पुराना वापस बहुखण्डीय सामान का एक सदस्य है कि एक यूआरआई के लिए एक अनुरोध के शरीर ।

आप की कोशिश करने के लिए एक का उपयोग एक फ़ाइल के लिए उदाहरण.

2021-11-24 07:53:27

आप स्पष्ट कर सकते हैं pls जो स्टाफ है, क्योंकि मैंने देखा कि इस सवाल का stackoverflow.com/questions/34562950/... और प्रयोग किया जाता के कर्मचारियों से उसे
Andrew

क्या आप देख somerhing के लिए एक uri वहाँ? पर के लिए एक इनपुट स्ट्रीम है?
blackapps

गूगल के लिए inputstreamrequestbody.
blackapps

मैं कोशिश की, का उपयोग करने के लिए इनपुट स्ट्रीम के रूप में आप ने कहा है, लेकिन साथ बाइट सरणी का उपयोग, और मेरी अपलोड विधि में विफल रहता है पर फ़ाइल आकार > 90mb, आप देख सकते हैं मेरा सवाल युपीडी pls?
Andrew

मैं केवल इतना ही कह उपयोग करने के लिए उड़ी । यह लगता है आप नहीं कर रहे हैं कि कर रहे हैं. आप का उपयोग नहीं करना चाहिए एक बाइट सरणी. या एक इनपुट स्ट्रीम है । अच्छी तरह से... नहीं, इस तरह से.
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ý
..................................................................................................................