Отправка двоичного файла через HTTP с помощью React-Native Fetch API

Есть ли способ использовать API Fetch для загрузки двоичного файла (например, в S3 с использованием подписанного URL-адреса)?

Это было бы простым PUT для некоторого "application/octet-stream".

Библиотека XHR работает, но я считаю, что Fetch лучше, особенно в среде React-Native. Поддерживает ли React-Native Fetch Blob в настоящее время?

В идеале я хотел бы сделать что-то подобное, но Blob не определено:

fetch('https://s3.amazonaws.com/signedUrl/', { method: 'PUT', headers: { 'Content-Type': 'application/octet-stream', }, body: Blob(filePath) })

1 ответ

Это работает на Android/iOS и симуляторах, если у вас есть путь файловой системы к вашему двоичному файлу, например, изображение с использованием встроенного XMLHttpRequest для отправки запросов:

const xhr = new XMLHttpRequest();
xhr.open('post', serviceUrl);
xhr.onreadystatechange = () => {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      resolve(xhr.response);
    } else {
      reject(xhr.response);
    }
  }
};

xhr.setRequestHeader('Content-Type', 'image/jpeg');

xhr.send({ uri: 'pathToFile', type: 'image/jpeg', name: 'file' });

Пример pathToFile в macOS: file:///Users/username/Library/Developer/CoreSimulator/Devices/061D4A47-6363-4996-A157-03E6AD2DD9E4/data/Containers/Data/Application/3900F3EF-3259-43CF-9400-87B638EF9A1B/Library/Caches/Camera/F86E7345-080A-4D51-A80E-0CAD3370A353.jpg

Я бы порекомендовал использовать: https://github.com/github/fetch качестве полизаполнения для Fetch, так как не поддерживается широко.

Получить образец документации:

var input = document.querySelector('input[type="file"]')

var data = new FormData()
data.append('file', input.files[0])
data.append('user', 'hubot')

fetch('/avatars', {
  method: 'POST',
  body: data
})

Я использую это следующим образом:

var input = document.querySelector('input[type="file"]')

function upload(e) {
  const file = input.files[0];
  const reader = new FileReader();

  reader.onload = (e) => { 
    fetch('/avatars', {
      method: 'POST',
      body: e.currentTarget.result
    })
  };

  reader.readAsArrayBuffer(file);
}

input.addEventListener('change', upload, false)
Другие вопросы по тегам