Загрузка в Cloudinary API — недопустимый параметр файла

#javascript #ios #react-native #async-await #cloudinary

#javascript #iOS #react-native #асинхронный -ожидание #cloudinary

Вопрос:

Я работаю над интеграцией Cloudinary с моим приложением React Native и сталкиваюсь с проблемой при переходе к загрузке с использованием Cloudinary API. Я использую средство выбора изображений React Native для выбора изображения из фотопленки и, используя его, получаю исходный uri — пример ниже.

Я получаю ответ об ошибке от Cloudinary, и я не уверен, к чему он относится. "Invalid file parameter. Make sure your file parameter does not include '[]'"

Когда я использую отладчик, я могу консольно вывести все параметры, которые я отправляю в теле моего запроса. Любые предложения будут высоко оценены!

source.uri: /Users/IRL/Library/Developer/CoreSimulator/Devices/817C678B-7028-4C1C-95FF-E6445FDB2474/data/Containers/Data/Application/BF57AD7E-CA2A-460F-8BBD-2DA6846F5136/Documents/A2F21A21-D08C-4D60-B005-67E65A966E62.jpg

 async postToCloudinary(source) {
let timestamp = (Date.now() / 1000 | 0).toString();
let api_key = ENV.cloudinary.api;
let api_secret = ENV.cloudinary.api_secret
let cloud = ENV.cloudinary.cloud_name;
let hash_string = 'timestamp='   timestamp   api_secret
let signature = CryptoJS.SHA1(hash_string).toString();
let upload_url = 'https://api.cloudinary.com/v1_1/'   cloud   '/image/upload'

try {
  let response = await fetch(upload_url, {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      file: {
        uri: source.uri,
        type: 'image/jpeg'
      },
      api_key: api_key,
      timestamp: timestamp,
      signature: signature
    })
  });

  let res = await response.json();
  console.log(res);
} catch(error) {
  console.log("Error: ", error);
}
 

}

ОБНОВЛЕНИЕ Итак, я думаю, что теперь у меня работает кодировка base64, но я все еще получаю ту же ошибку.

 var wordArray = CryptoJS.enc.Utf8.parse(source.uri);
var file = CryptoJS.enc.Base64.stringify(wordArray);

try {
  let response = await fetch(upload_url, {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      file: {
        uri: file,
        type: 'image/jpeg;base64'
      },
      api_key: api_key,
      timestamp: timestamp,
      signature: signature
    })
  });
 

Комментарии:

1. Вы когда-нибудь пробовали получить base64 из изображения, а затем отправить его в Cloudinary?

2. Извините, я не совсем уверен, что это значит… как мне это сделать? Вы имеете в виду, что я должен кодировать uri изображения в base64 с помощью CryptoJS, а затем отправлять в Cloudinary?

3. Да, я определенно пропустил это в документации … source.uri должен быть закодирован в base64. Однако теперь появляется новая ошибка, ей не нравится мой закодированный URL. «Неподдерживаемый исходный URL»

Ответ №1:

Итак, оказывается, что исходные данные, которые я передавал, были неправильно отформатированы. Я смог передать его из плагина ImagePicker, который я использовал в качестве уже отформатированного URI данных (пример ImagePicker содержит два способа захвата вашего исходного файла, и я использовал неправильный). Я смог избавиться от материала CryptoJS и просто передать file: source.uri