El siguiente código para cargar funciona bien en iOS, pero en Android a veces (no siempre) devuelve el siguiente error debido a un tamaño de fragmento incorrecto.
Example Error: 400: Invalid request. There were 1527808 byte(s) in the request body. There should have been 3145728 byte(s) (starting at offset 15728640 and ending at offset 18874367) according to the Content-Range header.al intentar cargar un fragmento y sigue devolviendo el mismo error al volver a intentar cargar el mismo fragmento a menos que se reinicie la carga completa.
El fragmento creado para cargar tiene el tamaño correcto porque los valores en el encabezado Content-Range se toman del propio fragmento. De acuerdo con los encabezados, el tamaño del fragmento era el esperado, pero se están perdiendo datos durante la carga.
Me di cuenta de que esto sucede cuando el dispositivo se bloquea o se pone en segundo plano durante la carga.
Estoy usando RNFS para leer fragmentos del archivo y RNFetchBlob para la solicitud PUT.
function uploadChunk(offset) { let nextOffset = offset; const thisRecordingInProgress = isInProgress(); // true or false const totalBytes = thisRecordingInProgress ? '*' : size; // size = actual file size // if no offset is specified, fetch it from the server if (nextOffset === undefined) { const res = await RNFetchBlob.fetch('PUT', url, { 'Content-Length': '0', 'Content-Range': `bytes */${totalBytes}`, }); ({ nextOffset } = parseResponse(res)); } // 1. Creating chunk const chunk = await RNFS.read(path, CHUNK_SIZE, nextOffset, 'base64'); const end = nextOffset + Buffer.from(chunk, 'base64').length - 1; // 2. Upload request const resp = await RNFetchBlob.config({ IOSBackgroundTask: true, }) .fetch( 'PUT', URL, { 'Content-Length': `${CHUNK_SIZE}`, 'Content-Range': `bytes ${nextOffset}-${end}/${totalBytes}`, 'Content-Type': 'application/octet-stream', 'Transfer-Encoding': 'Chunked', }, chunk ) .uploadProgress(written => { // track upload Progress }); // ({ nextOffset } = await parseResponse(resp));// parses response from server for next offset if (nextOffset < 0) { // Completed } else { // Upload next chunk return uploadChunk(nextOffset); } }He intentado disminuir el tamaño del fragmento, pero el problema persiste. ¿Hay algo que deba hacer para permitir que esto funcione en segundo plano para Android? O alguna idea de cuál podría ser el problema. Realmente agradecería cualquier ayuda que pueda obtener. Gracias
Actualizaciones:
chunk = undefined después de que se complete la solicitud de carga para liberar memoria. Problema aún no solucionado.