Загрузка файла в React Native через fetch, XHR и ax ios не выполняется на Android, но работает на iOS - PullRequest
0 голосов
/ 09 июля 2020

Я рассмотрел все возможные решения этой проблемы по переполнению стека, проблемам Github, сути и тому подобному. Ни один из них не работал.

В основном я пытаюсь загрузить изображение, снятое с помощью response-native-camera, на Java API, и оно работает на iOS как на симуляторе, так и на физическом устройстве.

function handleOnPictureTaken (image) {
  const imageName = image.uri.split('/').pop()
  const imageExtension = imageName.split('.').pop()
  const imageType = `image/${imageExtension}`
  const source = { uri: image.uri, type: imageType, name: imageName }
  onPhotoSelected(source)
}

function onPhotoSelected (image) {    
  const photoData = new FormData()
  image = {
    ...image,
    uri: image.uri.replace('file://', '')
  }
  photoData.append('file', image)
  uploadFile(photoData)
}

function uploadFile(image) {
  const config = {
    method: 'POST',
    headers: {
      Accept: 'application/json',
      'Content-Type': 'multipart/form-data'
    },
    credentials: 'include'
  }
  if (method === 'POST' || method === 'PUT') {
    if (config.headers['Content-Type'] === 'application/json') {
      config.body = JSON.stringify(data)
    } else {
      config.body = data
    }
  }

  return fetch(url, config).then(checkJSON)
    .then(res => res.text())
    .then(parseJSON)
    .catch(rejectRequest)
}

Это отлично работает на iOS. Но на Android я продолжаю получать Network request failed, как показано ниже

Stack trace: TypeError: Network request failed
at anonymous (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:28469:31)
at call (native)
at dispatchEvent (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:34597:31)
at setReadyState (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:33681:33)
at __didCompleteResponse (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:33508:29)
at apply (native)
at anonymous (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:33618:52)
at apply (native)
at emit (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:6202:42)
at apply (native)
at __callFunction (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:5626:49)
at anonymous (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:5348:31)
at __guard (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:5580:15)
at callFunctionReturnFlushedQueue (http://192.168.0.103:8081/index.bundle?platform=android&dev=true&minify=false:5347:21)

Я изо всех сил пытаюсь выполнить эту работу. Физическое устройство Android подключено к той же сети Wi-Fi. Нормальные запросы POST работают. Но не удается загрузить только файлы.

Если у кого-то есть предложения, дайте мне знать.

1 Ответ

1 голос
/ 09 июля 2020

Проверьте в AndroidManifest. xml главный файл,

 <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher"
      android:allowBackup="true"
      android:usesCleartextTraffic="true"
      android:theme="@style/AppTheme">

Включает ли он этот текст android:usesCleartextTraffic="true"

И просто не забудьте создать новый apk, и затем проверьте это,

UPDAT:

Кто все еще борется с этой проблемой. это происходит из-за сетевого плагина Flipper. Я отключил его, и все работает нормально.

Мой обходной путь для выполнения этой работы - это комментарий строки номер 43

38      NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
39      NetworkingModule.setCustomClientBuilder(
40          new NetworkingModule.CustomClientBuilder() {
41            @Override
42            public void apply(OkHttpClient.Builder builder) {
43      //        builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
44            }
45          });
46      client.addPlugin(networkFlipperPlugin);

в этом файле android/app/src/debug/java/com/maxyride/app/drivers/ReactNativeFlipper.java

Сначала сделайте чистая сборка, 1. Объедините свое приложение в связку 2. Папку CLea с помощью cd android, а затем ./gradlew clean 3. Сделайте отладку apk с помощью ./gradlew assemblyDebug

Просто проверьте Github, нашел это, проверьте.

UPDATE2:

LINK link-rn

Надеюсь, это поможет. не стесняйтесь сомневаться

...