Ответы пользователя по тегу PHP
  • Как через php скачать файл и назвать его так как он был назван?

    @alpeg
    как мне узнать какое расширение у файла

    Сервер отдаёт имя файла в заголовке Content-Disposition в полях filename и/или в filename*.
    И тут есть два способа сохранить файл с этим именем и/или расширением из этого имени:
    1) включить в curl CURLOPT_HEADER и вытащить заголовок вместе с содержимым за один запрос. Ссылку на то как это сделать уже дал SagePtr.
    2) отправить сначала HEAD-запрос, в котором посмотреть заголовок ответа, а затем вторым запросом скачать файл.
    В обоих случаях надо парсить заголовок ответа Content-Disposition
    Ответ написан
    Комментировать
  • Как реализовать грамотную авторизацию PHP?

    @alpeg
    Грамотная авторизация делается вот как:
    Генерируем токен, ставим его пользователю в кукисы и пишем его в базу. Когда пришел запрос, проверяем, активен ли токен, и не протух ли, если всё ок, даём доступ, нет - шлём на авторизацию.
    Сессия для этого кстати необязательна. А, ну ещё второй токен, для CSRF. его тоже просто в кукисы.
    и там и там кукисы secure + httpOnly.
    Всё остальное - вариации на тему. Свои велосипеды городить не рекомендуется ввиду того, что они всегда приводят к дырам.

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

    Специально сгенерированный хэш - плохая идея, только абсолютно рандомный токен.
    Шифровать пароль и прочее в куку - очень плохая идея, забудьте.
    Шифровать userid и права - только в виде JWT, свой велосипед не городить, вечных и долгих токенов не давать (пусть обновляют, это обязательно).
    Ответ написан
  • Можно ли из JS передать обработанное изображение в $_FILES?

    @alpeg
    Да, можно.

    var data = new FormData();
    // вариант 1 (если blob был получен из canvas.toBlob(), то он уже будет иметь правильный mime-type)
    data.append("file_field_blob", blob, "filename1.jpg");
    // вариант 2
    data.append("file_field_file_1", new File([blob], "(будет-проигнорировано).jpg", {type:'image/jpeg'}), "filename2.jpg");
    // или так
    data.append("file_field_file_2", new File([blob], "filename3.jpg", {type:'image/jpeg'}));
    var request = new XMLHttpRequest();
    request.onload = function() {
    	if (this.status >= 200 && this.status < 400){
    		document.write(this.response);
    	}
    };
    request.open("POST", "phpinfo.php");
    request.send(data);

    Результат:
    $_SERVER['HTTP_CONTENT_TYPE'] = multipart/form-data; boundary=--...
    $_FILES['file_field_blob'] = Array (
        [name] => filename1.jpg
        [type] => image/jpeg
        [tmp_name] => C:\...\php....tmp
        [error] => 0
        [size] => 46196
    )
    $_FILES['file_field_file_1'] = Array (
        [name] => filename2.jpg
        [type] => image/jpeg
        [tmp_name] => C:\...\php....tmp
        [error] => 0
        [size] => 46196
    )
    $_FILES['file_field_file_2'] = Array (
        [name] => filename3.jpg
        [type] => image/jpeg
        [tmp_name] => C:\...\php....tmp
        [error] => 0
        [size] => 46196
    )

    new File() - https://developer.mozilla.org/en-US/docs/Web/API/F...
    FormData - https://developer.mozilla.org/en-US/docs/Web/API/F...

    Upd:
    Не используйте readAsDataURL! Вместо него надо использовать FileReader.readAsArrayBuffer().
    А если нужна ссылка, например для <img> то нужно создавать её через URL.createObjectURL (и после использования удалять через URL.revokeObjectURL())
    Ответ написан