मैं अनुरोध है जो काम करता है में अच्छी तरह से डाकिया:
और मैं कोशिश कर रहा हूँ करने के लिए इसे बनाने के साथ पुराना वापस. सामान्य में फ़ाइल आकार हो जाएगा >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