За последние 24 часа нас посетили 20886 программистов и 1823 робота. Сейчас ищут 911 программистов ...

PUT + file upload

Тема в разделе "Прочие вопросы по PHP", создана пользователем Sergey108, 19 авг 2016.

  1. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Привет.
    Как в REST решается следующая задача: загрузка нескольких файлов + текстовые данные, причем, методом PUT?
    Как вгрузить 1 файл понятно, как отправить данные тоже понятно, но как отправить несколько файлов, причем с данными.
    Интересуют только best-practices.


    Нужно ведь сперва очистить тело запроса от файлов, сохранив их во временном хранилище (php://temp, хотя бы), затем уже читать текстовые данные (json-представление).
    Но как понять где что, и как различить 1 файл от другого?
    Или все-же PUT не используется для таких сложных задач?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Рест вообще штука слабо применимая в условиях пхп. Её просто за уши притягивают. Но. Что мешает тебе обработать твой запрос как угодно, ведь по факту это один запрос? Чего тебя пугает?
     
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    multipart/form-data
    А put или post - да никакой разницы ;)
    Если не очень много мелких файлов - можно base64 в основном теле.
    Хотя чаще все же грузят файлы по-одному.
     
  4. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    А как обработать multipart/form-data штатными средствами PHP? Видел скрипты парсящие запрос, но они грузят весь запрос в память.. а если там 1гб файл!?
    т.е. посылают файл POST запросом и возвращают данные для привязки файла к сущности? Типо как фейсбук делает?
    --- Добавлено ---
    Насколько мне известно, REST и PHP друг к другу никакого отношения не имеют, как и любой другой ЯП. REST это все-же клиент-серверная архитектура.
    Ничего. Просто хочу знать как люди делают и как правильно.
     
  5. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А он его сам обрабатывает, это классическая схема отправки формы, файлы будут доступны в $_FILES, а вот json выковыривать из input.
    В случае реста скорее наоборот, создание сущности, а потом пост на что-то вроде /сущность/ID/file
    Ну а что мешает посмотреть, как он делает ;)
     
  6. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    PUT даже и не думает обрабатывать. Весь PUT находится в потоке php://input, и никакие переменные не заполняются, независимо от заголовков.
    Ну так я посмотрел, вот и говорю. Если делать публикацию с изображением, то он сперва картинку грузит а потом уже по нажатию кнопки сохраняет все остальное.
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну да, все так, не сообразил сразу.
    Но у меня есть серьезное подозрение, что там данные будут записаны во временный файл, который уже по php://input будет доступен, так что с памятью должно быть все ок. Но утверждать не берусь - нужно посмотреть исходники.
    Он, видимо, грузит в галерею, а потом уже прикрепляет из галереи. Короче, зависит от общей архитектуры, каких-либо стандартов тут нет.
     
  8. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    не, я тестил через REST клиент (Postman, расширение для хрома, обалденная штука), все данные находятся в потоке. На php.net есть пример как загрузить 1 файл PUTом, там читается из php://input и пишется в файл.

    Ну, в принципе схема понятна, отделяем данные от ресурсов, сохраняя по отдельности. Других вариантов походу и нет, либо они не практичны.
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Поток может быть файлом. В этом и суть потока, что ты со своей стороны не знаешь, из чего ты читаешь. Это нужно эксперементировать. Загрузи файл в несколько гигов и смотри расход памяти в процессе этого
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    типа того. Только вот пхпшники страдают странным и пытаются натянуть ужа на глобус, подбирая HTTP-коды ответа под свои задачи, что бред. Это раз. Два, в случае с сайтом иногда бывает удобно что-то добавить, что-то поменять, что-то удалить в одном запросе и нет никаких причин этого не делать.