Отправить файлы в запросе с помощью JSONAPI - PullRequest
0 голосов
/ 31 мая 2018

Я использую Rails 5 в качестве бэкэнда мобильного приложения.Проблема, которую я пытаюсь решить, - это получение запроса из приложения, содержащего информацию о клиенте плюс 2 фотографии .После короткого подхода появилось два варианта:

  1. Сначала отправьте файлы в POST multipart / form-data и верните идентификатор клиенту.После этого снова отправляется «реальный» запрос, и сервер должен связать идентификатор (метаданные) и файл.
  2. Отправлять файлы в формате Base64.encoded без изменения заголовка JSON.Что-то вроде:

    curl -X POST \
      -H "Content-Type: application/vnd.api+json" \
      -H "Cache-Control: no-cache" \
      -d '{
        "data": {
           "type": "identities",
           "attributes": {
             "param1": "first param",
             "param2": "second param",
             "image1": "data:image/png;base64,iVBORw0KGgoAAAANSU.....",
             "image2": "data:image/png;base64,iVBORw0KGgoAAAANSU....."
           }
         }' "http://API_URL/identity"
    

Мои опасения по поводу этих двух подходов соответственно:

  1. Поскольку мы ожидаем 2 файла, мы должны сделать запрос для каждогосвязать это с ID?Что ожидается, если второй вызов не достигнет сервера или недействителен?
  2. Какое количество байтов мы должны принять?Я думал о 10 МБ, но я не уверен, что это хорошая идея и как сервер будет реагировать?Является ли хорошей идеей сначала проверить тип и размер файла на уровне пользовательского интерфейса (мобильное приложение)?

Если кто-то может предложить что-то еще, я был бы очень признателен.Также, если у вас есть опыт решения этой проблемы, пожалуйста, поделитесь полезными ссылками, которые вы использовали, я также буду признателен за них.

1 Ответ

0 голосов
/ 31 мая 2018

1) Если вам нужно 2 файла за один запрос - передайте 2 файла как multipart / form-data, это вполне нормально.Если вы используете b64, вы сначала все кодируете, а потом все декодируете.Не лучшая идея.

2) Вы должны проверить эти файлы как на переднем, так и на заднем концах.Максимальное количество байтов должно быть примерно равно max_file1_size + max_file_2_size + max_other_fields_size + headers_size, меньше нужно угадывать, чем пытаться.

3) Будет хорошим вариантом использовать carrierwave - хороший драгоценный камень, и у вас будет намного меньше местасвязываться:)

...