Вероятно, это будет глупый вопрос, но у меня одна из тех ночей. В приложении я разрабатываю RESTful API, и мы хотим, чтобы клиент отправлял данные в формате JSON. Часть этого приложения требует от клиента загрузки файла (обычно изображения), а также информации об изображении.
Мне трудно отследить, как это происходит в одном запросе. Можно ли Base64 данных файла в строку JSON? Я собираюсь выполнить 2 сообщения на сервере? Я не должен использовать JSON для этого?
В качестве дополнительного примечания мы используем Grails на бэкэнде, и к этим службам обращаются нативные мобильные клиенты (iPhone, Android и т. Д.), Если что-то из этого имеет значение.
json
rest
grails
file-upload
Gregg
источник
источник
Ответы:
Я задал похожий вопрос здесь:
Как загрузить файл с метаданными с помощью веб-службы REST?
У вас есть три варианта:
multipart/form-data
POST и верните идентификатор клиенту. Затем клиент отправляет метаданные с идентификатором, а сервер повторно связывает файл и метаданные.источник
Вы можете отправить файл и данные за один запрос, используя тип содержимого multipart / form-data :
С http://www.faqs.org/rfcs/rfc2388.html :
Вы можете включить информацию о файле или информацию о поле в каждый раздел между границами. Я успешно реализовал сервис RESTful, который требовал от пользователя отправки как данных, так и формы, и multipart / form-data работали отлично. Служба была построена с использованием Java / Spring, а клиент использовал C #, поэтому, к сожалению, у меня нет примеров Grails, чтобы дать вам информацию о том, как настроить службу. Вам не нужно использовать JSON в этом случае, так как каждый раздел «form-data» предоставляет вам место для указания имени параметра и его значения.
Хорошая вещь об использовании multipart / form-data заключается в том, что вы используете HTTP-определенные заголовки, поэтому вы придерживаетесь философии REST об использовании существующих инструментов HTTP для создания вашего сервиса.
источник
Я знаю, что эта ветка довольно старая, однако мне здесь не хватает одного варианта. Если у вас есть метаданные (в любом формате), которые вы хотите отправить вместе с данными для загрузки, вы можете сделать один
multipart/related
запрос.Вы можете проверить RFC 2387 спецификацию для более подробной информации.
По сути, каждая часть такого запроса может иметь контент с различным типом, и все части так или иначе связаны (например, изображение и его метаданные). Части идентифицируются граничной строкой, а за последней граничной строкой следуют два дефиса.
Пример:
источник
Я знаю, что этот вопрос старый, но в последние дни я искал всю сеть, чтобы решить тот же вопрос. У меня есть веб-сервисы Grails REST и iPhone Client, которые отправляют фотографии, заголовки и описания.
Я не знаю, лучший ли у меня подход, но он такой легкий и простой.
Я делаю снимок, используя UIImagePickerController, и отправляю на сервер NSData, используя теги заголовка запроса для отправки данных снимка.
На стороне сервера я получаю фото, используя код:
Я не знаю, возникнут ли у меня проблемы в будущем, но сейчас работает нормально в производственной среде.
источник
Вот мой подход API (я использую пример) - как вы можете видеть, я не использую
file_id
(идентификатор загруженного файла на сервер) в API:Создать
photo
объект на сервере:Загрузить файл (обратите внимание, что
file
в единственном виде, потому что это только один на фотографию):И тогда, например:
Читать список фотографий
Прочитайте некоторые детали фотографии
Читать фото файл
Итак, вывод таков: сначала вы создаете объект (фотографию) с помощью POST, а затем отправляете второй запрос с файлом (снова POST).
источник
Объекты FormData: загрузка файлов с помощью Ajax
XMLHttpRequest Level 2 добавляет поддержку нового интерфейса FormData. Объекты FormData предоставляют способ простого создания набора пар ключ / значение, представляющих поля формы и их значения, которые затем можно легко отправить с помощью метода XMLHttpRequest send ().
https://developer.mozilla.org/en-US/docs/Web/API/FormData
источник
Поскольку единственный отсутствующий пример - пример ANDROID , я добавлю его. Этот метод использует пользовательский AsyncTask, который должен быть объявлен внутри вашего класса Activity.
Итак, когда вы хотите загрузить свой файл, просто позвоните:
источник
Я хотел отправить несколько строк на бэкэнд-сервер. Я не использовал json с multipart, я использовал параметры запроса.
URL будет выглядеть
Я передаю два параметра (uuid и type) вместе с загрузкой файла. Надеюсь, это поможет тем, у кого нет сложных данных json для отправки.
источник
Вы можете попробовать использовать https://square.github.io/okhttp/ библиотеку. Вы можете установить тело запроса multipart, а затем добавить объекты file и json отдельно, например так:
источник
источник
Пожалуйста, убедитесь, что у вас есть следующий импорт. Конечно другой стандартный импорт
источник
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String