Как передать файл в json

Обновлено: 21.11.2024

Если вам понравилось то, что вы узнали, погрузитесь!
Подпишитесь, чтобы получить доступ к этому руководству, а также к загрузке
видео, кода и скрипта.

Чтобы упростить задачу, я уже подготовил файл с именем pets.json и поместил его прямо в каталог своего проекта.

Вы можете найти этот файл в каталоге resources/ загрузки кода.

Откройте этот файл и посмотрите, что внутри:

Хорошо, давайте отступим и поговорим о JSON, который не имеет ничего общего с PHP, за исключением того, что PHP может его читать. JSON – это текстовый формат, который можно использовать для представления структурированной информации, например сведений о домашних животных:

На самом деле любой массив PHP имеет строковый эквивалент JSON, и мы можем преобразовать массивы PHP в JSON и наоборот. На самом деле существует функция json_encode, которая принимает массив и возвращает эквивалентную строку JSON. Давайте используем его, чтобы увидеть, как будет выглядеть массив нашего питомца:

При обновлении мы видим JSON, эквивалентный нашему массиву. И на самом деле это именно то, что мы имеем в pets.json.

Если вы попробуете это сделать, и ваш результат будет выглядеть немного уродливее, это потому, что у меня есть подключаемый модуль Chrome под названием JSONView, который добавляет пробелы, чтобы JSON был более удобочитаемым. Как и в случае с PHP, в JSON пробелы не имеют значения. Таким образом, эти две строки эквивалентны, но вторая приятнее для глаз!

Причина, по которой JSON существует, заключается в том, что фигурные скобки — это круто! Или, может быть, это сделано для того, чтобы разные системы могли взаимодействовать. Представьте, если бы наш сайт сохранял файлы, которые были отправлены и прочитаны каким-то совсем другим приложением. JSON волшебен, потому что он может быть прочитан PHP или любым другим языком, таким как Ruby, Python или JavaScript. Поэтому, даже если это другое приложение будет создано кучей щенков, они смогут прочитать нашу информацию. Таким образом, JSON — отличный способ обмена данными.

Вернувшись к PHP, давайте представим, что уже есть другая часть нашего сайта, где пользователи могут отправлять новых питомцев, и что когда они это делают, этот файл pets.json обновляется. Наша работа сейчас состоит в том, чтобы просто прочитать его содержимое и показать несколько милых мордашек.

Чтение и открытие файлов¶

Итак, во-первых, как мы можем загрузить содержимое файла в PHP? Ответ заключается в функции file_get_contents . Когда мы открываем его документацию, мы видим, насколько это просто. Единственным обязательным аргументом является имя файла. Он открывает этот файл и возвращает нам его содержимое в виде строки.

Помните, что аргументы, окруженные [], необязательны. Необязательные аргументы для file_get_contents используются редко.

Легко! Давайте используем его и установим содержимое в новую переменную! Чтобы проверить, работает ли он, воспользуемся нашим надежным var_dump :

При обновлении мы видим красивую строку JSON!

Предупреждения и ошибки в PHP¶

Чтобы поэкспериментировать, давайте изменим имя файла и посмотрим, что произойдет, если файл не существует:

на этот раз мы видим предупреждение от PHP:

Предупреждение: file_get_contents(dinosaurs.json): не удалось открыть поток: нет такого файла или каталога в /path/to/index.php в строке 16

В PHP есть как ошибки, так и предупреждения, когда что-то идет не так. Единственное отличие состоит в том, что если ошибка в коде не слишком серьезна, PHP просто выдает нам предупреждение и пытается продолжить выполнение нашего кода.

В PHP также есть уведомления, которые действуют так же, как и предупреждения.

Булевы значения: истина и ложь¶

Здесь он продолжается и выполняет наш var_dump , который возвращает false. Если мы снова посмотрим на документацию, то увидим, что file_get_contents возвращает содержимое файла в виде строки или возвращает false, если это возможно. т прочитать файл. false называется Boolean, это наш четвертый тип данных PHP. Для проверки у нас есть:

  1. Строки, например $var = 'Hello World';
  2. Числа, например $var = 5; . И на самом деле числа подразделяются на целые, например 5 , и числа с плавающей запятой, которые имеют десятичные дроби, например 5.12 . Но в большинстве случаев в PHP это вас не волнует.
  3. Массивы, например $var = array('puppy1', 'puppy2', 4);
  4. А теперь наш 4-й тип: булевы значения. Логические значения просты, потому что есть только два возможных значения: true и false :

Как и в случае с тремя другими типами данных, мы можем присваивать логические значения переменным, а функции могут возвращать логические значения. file_get_contents возвращает строку или false , который, как мы теперь знаем, является логическим типом.

Декодирование JSON в массив¶

Фу! Вернемся к нашим пушистым друзьям. Во-первых, исправьте имя файла. Помните, что содержимое JSON, которое мы читаем из файла, представляет собой строку, и на самом деле мы хотим преобразовать эту строку JSON в массив PHP. Мы использовали json_encode, чтобы преобразовать массив в JSON, поэтому имеет смысл использовать json_decode , чтобы пойти в другом направлении:

Когда мы обновляем, в основном все выглядит правильно.Но вместо массива он говорит что-то о «stdClass». Это объект PHP, о котором вам сейчас не нужно беспокоиться. Вместо этого, если мы посмотрим на документы json_decode , мы увидим, что у него есть необязательный второй аргумент, который является логическим или логическим значением, по умолчанию равным false . Если мы изменим это на true , функция должна вернуть ассоциативный массив:

Отлично! Это именно тот массив, который мы создавали вручную, поэтому удалите его вместе с оператором var_dump:

Когда мы обновимся, наша страница вернется! Строка JSON считывается из файла, а затем преобразуется в массив PHP. Наш код готов перебирать каждого питомца в этом массиве и распечатывать информацию о нем, используя ключи каждого питомца. Это работает, потому что информация в файле JSON точно соответствует массиву PHP, который у нас был раньше.

Если бы мы изменили ключ filename для каждого питомца в нашем источнике данных pets.json , нам также пришлось бы изменить его в нашем приложении, чтобы он соответствовал:

Путь к файлу¶

Обновите, чтобы убедиться, что это все еще работает. Прежде чем мы закончим, давайте немного поиграем с функциями обработки файлов PHP. Сначала переместите pets.json в новый каталог с именем data и обновите его. О нет, все взрывается!

PHP больше не находит наш файл, что запускает цепную реакцию ужасных вещей! Во-первых, file_get_contents возвращает false . Конечно, false не является допустимой строкой JSON, поэтому json_decode также захлебывается и не возвращает массив, как обычно. Наконец, мы пытаемся выполнить цикл с помощью foreach, но $pets даже не является массивом. Вау! Мораль в том, что иногда ошибка в одном месте приводит к ошибке впоследствии. Так что смотрите не только на номер строки с ошибкой, но и на строки над ним.

Чтобы исправить это, мы можем просто изменить путь к файлу на data/pets.json :

Когда мы обновимся, все снова будут счастливы! Обратите внимание, что file_get_contents ищет файлы относительно исполняемого. Мы поиграемся с путями к файлам позже, только не думайте, что это магия. PHP счастливо глуп: он ищет файлы прямо в каталоге этого.

Вы также можете передать PHP абсолютный путь к файлу, например /var/pets.json или C:\pets.json .

Сохранение в файл¶

А что, если вы хотите сохранить данные в файл? Если мы вернемся к документации для file_get_contents, вы увидите связанную функцию: file_put_contents . Это также очень просто: вы даете ему имя файла и строку, и он сохраняет эту строку в этом файле. Я позволю вам попробовать это самостоятельно в упражнениях. Не беспокойтесь о его необязательных аргументах.

Другие способы чтения и сохранения файлов¶

В PHP помимо file_get_contents и file_put_contents есть множество других функций для работы с файлами. К ним относятся fopen , fread , fwrite и fclose . А пока просто забудьте об их существовании. За исключением случаев, когда вы имеете дело с очень большими файлами, эти функции выполняют то же самое, что и file_get_contents и file_put_contents, просто их сложнее и страннее использовать. Что еще хуже, большинство учебных пособий в Интернете научат вас использовать эти функции. Безумие! Вы, вероятно, когда-нибудь воспользуетесь ими, но забудьте о них сейчас. Для работы с файлами в PHP нам понадобятся только наши 2 удобные функции.

Не пытайтесь опубликовать большой блоб, ваш терминал возненавидит вас, и вы будете ненавидеть себя. Это будет продолжаться во веки веков.

Используйте приведенный выше синтаксис ( curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION ), чтобы вместо этого указать файл.

ted-fastly прокомментировал 20 июня 2019 г.

ungoldman прокомментировал 21 июня 2019 г.

@ted-sigsci, спасибо! исправлено (нет изображения 🙅‍♂️ )

ted-fastly прокомментировал 21 июня 2019 г.

Я бы даже не комментировал, но мы знаем друг друга из интернета и все такое.

ungoldman прокомментировал 21 июня 2019 г.

Комментарий @ted-sigsci приветствуется! Спасибо за внимание к интернет-другу 👍

greysou1 прокомментировал 22 июня 2019 г.

Здравствуйте, я столкнулся с этой ошибкой, не могли бы вы мне помочь?

прокомментировал ungoldman 23 июня 2019 г. •

Raj2032 прокомментировал 11 августа 2019 г.

Спасибо за помощь, мне помогло :)

Прокомментировал Querela 8 апреля 2020 г.

ReactiveSlime прокомментировал 28 апреля 2020 г.

спасибо. это было полезно

jieunychoi прокомментировал 20 октября 2020 г.

комментарий rubenflush прокомментирован 30 октября 2020 г.

VinceSJ прокомментировал 2 декабря 2020 г.

junoatwork прокомментировал 3 декабря 2020 г.

ungoldman прокомментировал 3 декабря 2020 г.

@junoatscroll спасибо!

snepal87 прокомментировал 18 февраля 2021 г.

Что делать, если мне нужно изменить значение объекта Json во время публикации?

Например, мое имя файла.json

Мой "id" не всегда может быть "abcd" и может быть динамическим.
Я хочу опубликовать этот Json-файл, используя приведенный выше Curl, но я хочу передавать «id» в качестве динамического значения каждый раз, когда я публикую Json. Как мне это сделать?

ungoldman прокомментировал 18 февраля 2021 г.

@snepal87 звучит так, будто вам нужно использовать функцию.

Хоффман прокомментировал 22 февраля 2021 г.

Комментарий SoCalBeachrunner прокомментировал 15 апреля 2021 г.

Спасибо. Вылечил мою головную боль.

Прокомментировал ChosenMoren 24 апреля 2021 г.

Как узнать пункт назначения?

xoxwgys56 прокомментировал 27 мая 2021 г.

Большое спасибо 👍

Fran-Rg прокомментировал 14 июля 2021 г.

Как бы вы обработали специальный символ в имени файла? Например, пробелы или '(' Я пробовал заключать их в одинарные кавычки:
--data '@xyz (2).json', но получил "неожиданный токен" ('"

ungoldman прокомментировал 14 июля 2021 г.

@Fran-Rg Я думаю, вам нужно экранировать специальные символы, используя \

labuscpi прокомментировал 16 июля 2021 г. •

Что делать, если мне нужно изменить значение объекта Json во время публикации?

Например, мое имя файла.json

"id": "abcd",
"имя": "имя"
"адрес": "улица",
>

Мой "id" не всегда может быть "abcd" и может быть динамичный.
Я хочу опубликовать этот Json-файл, используя приведенный выше Curl, но я хочу передавать «id» в качестве динамического значения каждый раз, когда я публикую Json. Как мне это сделать?

laduke прокомментировал 28 сентября 2021 г.

roneygomes прокомментировал 27 октября 2021 г.

Gerst20051 прокомментировал 3 марта 2022 г.

Вы можете преобразовать содержимое json-файла в curl с помощью параметра --data-raw

curl 'https://api.com/route' -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"

Примечание: комментарии в файле json отфильтровываются с помощью команды grep -v '^\s*//'

Вы также можете передать данные в curl через стандартный ввод с помощью grep или cat

Вы не можете выполнить это действие в данный момент.

Вы вошли в другую вкладку или окно. Перезагрузите, чтобы обновить сеанс. Вы вышли на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.

Текст был успешно обновлен, но возникли следующие ошибки:

gampasandeep прокомментировал 2 августа 2017 г.

На скриншоте вместе с этим файлом мне нужно отправить следующие данные. Возможно ли это??
"поле1":"",
"поле2":"",
"поле3":""

комментарий blitforge сделан 2 августа 2017 г.

Конечно. Просто добавьте эти поля под полем вашего файла, так как отдельные строки должны работать нормально.

gampasandeep прокомментировал 2 августа 2017 г.

Да, спасибо.
Он работает нормально. Но могу ли я отправить все поля как один объект.

urn046 прокомментировал 28 сентября 2017 г.

Я столкнулся с проблемой при отправке POST-запроса, содержащего файл xml и данные json.
Он показывает неверный формат запроса
как мне его исправить?

gampasandeep прокомментировал 28 сентября 2017 г.

@urn046 объект json, который вы пытаетесь отправить, имеет недопустимый формат.

Попробуйте указать ключ объекта json в качестве параметра ключа и значение в качестве параметра значения в данных формы.

Прокомментировал Huiziryuu 29 сентября 2017 г. •

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; имя="jsondata"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; имя="полезные_данные"; filename="test.pdf"
Тип содержимого: application/pdf

janpridal прокомментировал 24 ноября 2017 г. •

sify21 прокомментировал 23 марта 2018 г. •

JSON-часть тела также должна быть установлена ​​как «Файл», а не как «Текст», и поместить ваши данные json в файл json, например «a.json».
Просто узнайте, что этот метод не работает в Windows, но отлично работает в Linux.

прокомментировал amberream 12 апреля 2018 г.

Подтверждено, что он работает в Linux, но не в Windows. Было бы здорово заставить его работать в Windows.

savithaAjitraj прокомментировала 10 мая 2018 г.

Привет, почтальон теперь поддерживает multipart?

swateek прокомментировал 10 мая 2018 г.

@sify21 это не помогает. Есть еще мысли?

Код в моем случае ищет req.body, если я хочу отправить через POSTMAN, я не могу этого добиться вместе с файлом из данных формы.

прокомментировал matthiasbe 25 июня 2018 г. •

Здравствуйте,
Похоже, у меня все работает в Windows 10 с использованием метода @sify21.
Я добавил два файла: один содержит мое изображение, а другой — файл JSON, содержащий данные json, которые я хочу отправить.

Соответствующая конечная точка Spring выглядит следующим образом:

прокомментировал amberream 25 июня 2018 г.

Я использую (новое?) приложение ARC для Chrome вместо PostMan, чтобы обойти эту проблему. Он отлично работает в Windows с ARC!

Недавно я столкнулся с проблемой одновременного использования multipart и JSON в своем проекте. Я хотел бы поделиться своими знаниями о том, как можно решить эту проблему.

Для этого сценария я взял пример приложения Spring-Boot, в котором используются JSON/POJO и Multipart. Ниже приведены шаги для одновременной передачи нескольких файлов с использованием POJO

Swagger-UI (2.9.2) не поддерживает API списка составных файлов. Итак, я использовал Postman. Давайте сделаем это.

Шаг 1. Создайте простое приложение Spring-Boot.

Создайте приложение Spring или Spring-Boot в eclipse IDE. Кроме того, мы можем загрузить его с веб-сайта Spring.io.

Шаг 2. Создайте один контроллер, модель и службу.

Теперь я беру данные пользователя, и пользователь может одновременно загружать список файлов. Сведения о файле не обязательно добавлять в класс User POJO.

Пользователь:

Созданы геттеры и сеттеры для класса POJO.

Шаг 3. Используйте Multipart в контроллере.

Как мы все знаем, контроллер определяет наше действие и то, когда мы хотим создать определенный API и получить ответ через API.

Выбор глобального партнера по разработке программного обеспечения для ускорения вашей цифровой стратегии

Чтобы добиться успеха и опередить конкурентов, вам нужен партнер по разработке программного обеспечения, который преуспевает именно в том типе цифровых проектов, с которыми вы сейчас сталкиваетесь, и максимально экономичным и оптимизированным способом.

Получить руководство

Чтобы передать Json и Multipart в методе POST, нам нужно указать наш тип контента в части потребления.

И нам нужно передать данный параметр как пользовательский и составной файл. Здесь убедитесь, что мы можем передавать только String + файл, а не POJO + файл.

@RequestPart("user") Строковый пользователь, @RequestPart("file") Файл списка

Затем преобразуйте строку в Json с помощью ObjectMapper на уровне службы.

Контроллер пользователя:

Шаг 4. Измените POJO на строку.

Обычно мы добавляем @RequestBody и упоминаем имя класса для создания данных методом POST. Но здесь мы должны добавить как Json, так и multipart. Итак, аннотацию следует изменить.

Шаг 5. Вызов строки в формате Json.

Преобразуйте строку в JSON с помощью ObjectMapper. Вызовите его из контроллера в сервис, как показано ниже:

Пользовательская служба:

Шаг 6. Тестирование с помощью нашего API.

Шаг 7. Загрузите составной файл и POJO в Postman.

Теперь проверьте ответ с помощью Postman, добавив параметры и значения тела, как показано ниже.

Пример запроса:

Теперь давайте прикрепим образец файла, который нам нужно передать в запросе.

Ответ:

Похоже, все готово и вычищено….

Читайте также: