У меня есть веб-сервис REST, который в настоящее время предоставляет этот URL:
Http: // сервер / данные / СМИ
где пользователи могут POST
следующие JSON:
{
"Name": "Test",
"Latitude": 12.59817,
"Longitude": 52.12873
}
для того, чтобы создать новые метаданные медиа.
Теперь мне нужна возможность загружать файл одновременно с метаданными медиа. Какой лучший способ сделать это? Я мог бы ввести новое свойство с именем file
base64 и кодировать файл, но мне было интересно, есть ли лучший способ.
Там также используется multipart/form-data
то, что отправляет HTML-форма, но я использую веб-сервис REST и хочу использовать JSON, если это вообще возможно.
web-services
json
rest
file-upload
Даниэль Т.
источник
источник
Ответы:
Я согласен с Грегом, что двухэтапный подход является разумным решением, но я бы сделал это наоборот. Я бы сделал:
Чтобы создать запись метаданных и вернуть ответ, например:
Затем клиент может использовать этот ContentUrl и сделать PUT с данными файла.
Хорошая вещь в этом подходе состоит в том, что когда ваш сервер начинает перегружаться огромными объемами данных, возвращаемый вами URL может просто указывать на какой-то другой сервер с большим пространством / емкостью. Или вы могли бы реализовать какой-то подход циклического перебора, если пропускная способность является проблемой.
источник
То, что вы не заключаете тело запроса в JSON, вовсе не означает, что использовать REST
multipart/form-data
для размещения как JSON, так и файлов в одном запросе не рекомендуется:на стороне сервера (используя Python для псевдокода):
для загрузки нескольких файлов можно использовать отдельные «поля формы» для каждого:
... в этом случае код сервера будет иметь
request.args['file1'][0]
иrequest.args['file2'][0]
или используйте один и тот же для многих:
... в этом случае
request.args['files']
просто будет список длиной 2.или пропустите несколько файлов через одно поле:
... в этом случае
request.args['files']
будет строка, содержащая все файлы, которые вам придется анализировать самостоятельно - не уверен, как это сделать, но я уверен, что это не сложно, или лучше просто использовать предыдущие подходы.Разница между
@
и<
заключается в том,@
что файл прикрепляется при загрузке файла, тогда<
как содержимое файла прикрепляется как текстовое поле.PS Только то, что я использую
curl
в качестве способа генерацииPOST
запросов, не означает, что те же самые HTTP-запросы не могут быть отправлены с языка программирования, такого как Python, или с использованием достаточно мощного инструмента.источник
curl -f 'metadata={"foo": "bar"}'
?Один из способов решения этой проблемы - сделать загрузку двухфазной. Во-первых, вы должны загрузить сам файл, используя POST, где сервер возвращает некоторый идентификатор обратно клиенту (идентификатор может быть SHA1 содержимого файла). Затем второй запрос связывает метаданные с данными файла:
Включение файла base64, закодированного в сам запрос JSON, увеличит размер передаваемых данных на 33%. Это может или не может быть важным в зависимости от общего размера файла.
Другой подход может состоять в том, чтобы использовать POST необработанных данных файла, но включать любые метаданные в заголовок HTTP-запроса. Однако это немного выходит за рамки основных операций REST и может быть более неудобным для некоторых клиентских библиотек HTTP.
источник
Я понимаю, что это очень старый вопрос, но, надеюсь, это поможет кому-то другому, когда я наткнулся на этот пост в поисках того же самого. У меня была похожая проблема, просто мои метаданные были Guid и int. Решение то же самое, хотя. Вы можете просто сделать необходимые метаданные частью URL.
Метод приема POST в вашем классе «Контроллер»:
Тогда во что бы вы ни регистрировали маршруты, WebApiConfig.Register (конфигурация HttpConfiguration) для меня в этом случае.
источник
Если ваш файл и его метаданные создают один ресурс, вполне нормально загрузить их оба в одном запросе. Пример запроса будет:
источник
Я не понимаю, почему за восемь лет никто не опубликовал простой ответ. Вместо того, чтобы кодировать файл как base64, закодируйте json как строку. Затем просто декодируйте JSON на стороне сервера.
В Javascript:
POST это используя Content-Type: multipart / form-data
На стороне сервера извлеките файл обычным способом и извлеките json в виде строки. Преобразуйте строку в объект, который обычно представляет собой одну строку кода, независимо от того, какой язык программирования вы используете.
(Да, это прекрасно работает. Делаю это в одном из моих приложений.)
источник