Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
1

Запись файла в сессию

26.10.2015, 19:38. Показов 2088. Ответов 21
Метки нет (Все метки)

Есть три основных файла.
Задача стоит такая: записать изображение в сессию, чтобы выводить на страничке look.htm последние загруженные изображения.
Вот что пока попробовал, так же есть закомментированная часть, которая не помогла ничем.
look.htm
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html" />
    <meta name="author" content="admin" />
    <link rel="shortcut icon" href="../img/icon.png" type="image/png" />
    <title>Добро пожаловать!</title>
</head>
<body>
Добро пожаловать!
Загрузить изображение
<div>
    <form action="model_session.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" value="<?php echo $_SESSION['myfile']; ?>" />
        <button type="submit">Загрузить</button>
    </form>
</div>
</body>
</html>
Model_session.php
PHP
1
2
3
4
5
6
7
8
9
10
<?php
session_start();
$whitelist = array(
    'myfile' => 'myfile'
);
$incoming = array_keys(array_intersect_key($_POST, $whitelist));
foreach($whitelist as $key){
    $_SESSION[$key] = $_POST[$key];
}
header('Location: upload.php');
upload.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
session_start();
$TypesImage = array(
    "image/png" => 'png',
    "image/jpeg" => 'jpeg',
    "image/gif" => 'gif'
); // сервер открывает и проверяет файлы и допускает только разрешенные типы
if(is_array($_FILES) && is_array($_FILES['myfile'])){
    if ($_FILES['myfile']['size'] == 0){ //если размер файла равен нулю - выдать ошибку
        echo "Файл пустой!";
        die();
    } elseif($_FILES['myfile']['error'] != 0) { //если количество ошибок не равно нулю - выдать следующую ошибку
        echo "Произошла ошибка при загрузке файла ";
        echo "<pre>"; print_r(error_get_last()); echo "</pre>"; //error_get_last - возвращает некий массив в котором есть последняя ошибка
    } elseif(!array_key_exists($_FILES['myfile']['type'], $TypesImage)){// print_r - потому что echo не может вывести массив
        echo "Данный тип файла запрещен!";//array_key_exists - проверяет наличие ключей, в данном случае ключ и есть тип
        die();
    } else {
        $filedirname = __DIR__ . '/files/';
        $thumbdirname = __DIR__ . '/thumbs/';
        $name = sha1_file($_FILES['myfile']['tmp_name']); //sha1_file - хеширует целиком весь файл, имя файлы полностью хешированно
        $extention = $TypesImage[$_FILES['myfile']['type']];
        $filepath = $filedirname . $name . '.' . $extention;//basename - фильтрует имена полученных файлов, записывая только имя, без
        $thumbpath = $thumbdirname . $name . '.' .$extention;
        $result = move_uploaded_file($_FILES['myfile']['tmp_name'], $filepath);//каких - либо спец символов
        if(!$result){
            echo "Ошибка перемещения файла";
            echo '<pre>'; print_r(error_get_last()); echo '</pre>';
            die();
        } else {
            try{
                $image = new Imagick($filepath);
                $image->setbackgroundcolor('rgb(255,255,255)');// задаем задний фон. В данном случае - белый
                $image->thumbnailImage(140,140,true,true);// благодаря двум true картинка всегда квадратная и дополняется белым цветом
                $result = $image->writeImage($thumbpath);// writeImage - записывает нашу картинку на диск
            
                if($result !== true){
                    echo "Ошибка при создании уменьшенной аватарки";
                    die();
                }
            }
            catch(exception $e){
                echo $e; //так не стоит делать, так как в логах может храниться очень приватная информация
                die();//убить процесс
            }
        }
        header('Location: view_model.php');
    }
} else {
    echo "Вы не загрузили файл";
    echo '<br />' . '<a href = "look.htm">Назад</a>';
    }
    /*$SessionFileName = $_SESSION['myfile'];
    echo <<<_END
    <form action="look.htm" method="POST">
        <input type="hidden" name="myfile" value="<?php echo $SessionFileName; ?>" />
    </form>
_END;
*/
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2015, 19:38
Ответы с готовыми решениями:

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

Запись данных из php в сессию
Здравствуйте. В общем мучаюсь уже не один день над проблемой.. решил сюда написать. на php...

Запись данных в сессию и использование этих данных в запросах
Здравствуйте) подскажите, пожалуйста... я записываю в сессию определенные данные - вот так...

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

21
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
26.10.2015, 20:35 2
там же типа форма должна $_FILES отсылать...
сори не глянул куда отсылает форма

Добавлено через 4 минуты
а как ты его хочешь выводить? путь к изображению или изображение целиком?
0
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
26.10.2015, 21:04  [ТС] 3
Изображение сжатое. миниатюру, они у меня хранятся в thumbs имена совпадают с именами оригинальных картинок в папке files
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
26.10.2015, 21:14 4
HTML5
1
<input type="file" name="myfile" value="<?php echo $_SESSION['myfile']; ?>" />
в $_SESSION['myfile'] хранится имя на локальном диске?
0
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 10:36  [ТС] 5
да. у меня

Добавлено через 12 часов 29 минут
Цитата Сообщение от Roman2288 Посмотреть сообщение
if(is_array($_FILES) && is_array($_FILES['myfile'])){
-> ошибка возникает на этой проверке
Цитата Сообщение от Roman2288 Посмотреть сообщение
} else {
* * echo "Вы не загрузили файл"; - > после чего выдает данную ошибку
* * echo '<br />' . '<a href = "look.htm">Назад</a>';
* * }
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
27.10.2015, 15:45 6
Лучший ответ Сообщение было отмечено Roman2288 как решение

Решение

Короче, есть форма, которая отправляет на model_session.php
HTML5
1
2
3
4
    <form action="model_session.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" value="<?php echo $_SESSION['myfile']; ?>" />
        <button type="submit">Загрузить</button>
    </form>
где в model_session.php $_FILES?

Добавлено через 7 минут
Далее.
model_session.php
PHP
1
2
3
4
5
6
7
8
9
session_start();
$whitelist = array(
    'myfile' => 'myfile'
);
$incoming = array_keys(array_intersect_key($_POST, $whitelist));
foreach($whitelist as $key){
    $_SESSION[$key] = $_POST[$key];
}
header('Location: upload.php');
Зачем такой замудренный переброс переменных? ну да ладно...
вместо $_POST должно быть $_FILES

Добавлено через 1 минуту
Зачем в модел пхп идет переброс на upload.php? ну да ладно...
в upload.php начинай уже работать с $_SESSION вместо $_FILES

Добавлено через 2 минуты
то есть
PHP
1
2
3
if($_SESSION['myfile']){
$_SESSION['myfile']['size']
}
... и так далее

Добавлено через 22 минуты
upload.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
session_start();
$TypesImage = array('GIF','JPG','PNG','SWF','PSD','BMP','TIFF','TIFF','JPC','JP2','JPX');
if($_SESSION['myfile']){
    $img=getimagesize($_SESSION['myfile']['tmp_name']);
    if (!$_SESSION['myfile']['size']){ exit("Файл пустой!"); } 
    elseif($_SESSION['myfile']['error']){ exit($_SESSION['myfile']['error']); } 
    elseif(!$img){ exit("Данный тип файла запрещен!"); } 
    else {
        $filedirname = $_SERVER['DOCUMENT_ROOT'].'/files/';
        $thumbdirname = $_SERVER['DOCUMENT_ROOT'].'/thumbs/';
        $name = sha1_file($_SESSION['myfile']['tmp_name']); //sha1_file - хеширует целиком весь файл, имя файлы полностью хешированно
        $extention = $TypesImage[$img[2]];
        $filepath = $filedirname . $name . '.' . $extention;//basename - фильтрует имена полученных файлов, записывая только имя, без
        $thumbpath = $thumbdirname . $name . '.' .$extention;
        $result = move_uploaded_file($_SESSION['myfile']['tmp_name'], $filepath);//каких - либо спец символов
        if(!$result){
            echo "Ошибка перемещения файла";
            echo '<pre>'; print_r(error_get_last()); echo '</pre>';
            die();
        } else {
            try{
                $image = new Imagick($filepath);
                $image->setbackgroundcolor('rgb(255,255,255)');// задаем задний фон. В данном случае - белый
                $image->thumbnailImage(140,140,true,true);// благодаря двум true картинка всегда квадратная и дополняется белым цветом
                $result = $image->writeImage($thumbpath);// writeImage - записывает нашу картинку на диск
            
                if($result !== true){
                    echo "Ошибка при создании уменьшенной аватарки";
                    die();
                }
            }
            catch(exception $e){
                echo $e; //так не стоит делать, так как в логах может храниться очень приватная информация
                die();//убить процесс
            }
        }
        header('Location: view_model.php');
    }
}
else {
    echo "Вы не загрузили файл";
    echo '<br />' . '<a href = "look.htm">Назад</a>';
    }
Добавлено через 3 минуты
меня только смущает эта строчка
HTML5
1
<input type="file" name="myfile" value="<?php echo $_SESSION['myfile']; ?>" />
она будет выводить Array. Надо так
HTML5
1
<input type="file" name="myfile" value="<?=$_SESSION['myfile']['name'];?>" />
1
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 17:42  [ТС] 7
Цитата Сообщение от asql Посмотреть сообщение
$name = sha1_file($_SESSION['myfile']['tmp_name']);
Вот на эту строку ссылается ошибка
Ошибка перемещения файла
Array
(
[type] => 8
[message] => Undefined variable: name
[file] => D:\Server\OpenServer\domains\practice.ru\php\register\php\up load.php
[line] => 24
)

Добавлено через 2 минуты
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
session_start();
$TypesImage = array(
    "image/png" => 'png',
    "image/jpeg" => 'jpeg',
    "image/gif" => 'gif'
); // сервер открывает и проверяет файлы и допускает только разрешенные типы
if(is_array($_SESSION) && is_array($_SESSION['myfile'])){
    if ($_SESSION['myfile']['size'] == 0){ //если размер файла равен нулю - выдать ошибку
        echo "Файл пустой!";
        die();
    } elseif($_SESSION['myfile']['error'] != 0) { //если количество ошибок не равно нулю - выдать следующую ошибку
        echo "Произошла ошибка при загрузке файла ";
        echo "<pre>"; print_r(error_get_last()); echo "</pre>"; //error_get_last - возвращает некий массив в котором есть последня ошибка
    } elseif(!array_key_exists($_SESSION['myfile']['type'], $TypesImage)){// print_r - потому что echo не может вывести массив
        echo "Данный тип файла запрещен!";//array_key_exists - проверяет наличие ключей, в данном случае ключ и есть тип
        die();
    } else {
        $filedirname = $SERVER['DOMENT_ROOT'] . '/files/';
        $thumbdirname = $SERVER['DOCUMENT_ROOT'] . '/thumbs/';
        $name = sha1_file($_SESSION['myfile']['tmp_name']); //sha1_file - хеширует целиком весь файл, имя файлы полностью хешированно
        $extention = $TypesImage[$_SESSION['myfile']['type']];
        $filepath = $filedirname . $name . '.' . $extention;//basename - фильтрует имена полученных файлов, записывая только имя, без
        $thumbpath = $thumbdirname . $name . '.' .$extention;
        $result = move_uploaded_file($_SESSION['myfile']['tmp_name'], $filepath);//каких - либо спец символов
        if(!$result){
            echo "Ошибка перемещения файла";
            echo '<pre>'; print_r(error_get_last()); echo '</pre>';
            die();
        } else {
            try{
                $image = new Imagick($filepath);
                $image->setbackgroundcolor('rgb(255,255,255)');// задаем задний фон. В данном случае - белый
                $image->thumbnailImage(140,140,true,true);// благодаря двум true картинка всегда квадратная и дополняется белым цветом
                $result = $image->writeImage($thumbpath);// writeImage - записывает нашу картинку на диск
            
                if($result !== true){
                    echo "Ошибка при создании уменьшенной аватарки";
                    die();
                }
            }
            catch(exception $e){
                echo $e; //так не стоит делать, так как в логах может храниться очень приватная информация
                die();//убить процесс
            }
        }
        header('Location: view_model.php');
    }
} else {
    echo "Вы не загрузили файл";
    echo '<br />' . '<a href = "look.htm">Назад</a>';
    }
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
27.10.2015, 18:39 8
ну пропиши
$name = md5(time());
0
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 19:34  [ТС] 9
не помогло(
0
1887 / 1491 / 687
Регистрация: 17.11.2012
Сообщений: 6,467
27.10.2015, 20:40 10
вы записали в сессию путь к временному файлу(tmp_name) и после этого идет перенаправление на другую страницу.
в сессии есть путь к временному файлу, а файла то уже нет. так как временный файл удаляется после завершения работы скрипта
1
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 21:06  [ТС] 11
Так, и что мне сделать? Как то сам файл записать в сессию? Или что?
0
1887 / 1491 / 687
Регистрация: 17.11.2012
Сообщений: 6,467
27.10.2015, 21:27 12
я не знаю, что посоветовать. так как не совсем понимаю, зачем сначала данные из $_FILES переписывать в сессию, а потом сохранять файл используя значения из $_SESSION.
0
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 21:36  [ТС] 13
я хочу на странице look.htm выводить последние загруженные картинки.
0
1887 / 1491 / 687
Регистрация: 17.11.2012
Сообщений: 6,467
27.10.2015, 21:59 14
Цитата Сообщение от Roman2288 Посмотреть сообщение
я хочу на странице look.htm выводить последние загруженные картинки.
данные изображения(имя, ссылка), записываются (в базу или файл)?
0
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
27.10.2015, 22:13  [ТС] 15
в бд

Добавлено через 2 минуты
нет не так, в форме выбирается изображение и записывается в директорию files/ в папке сайта. Так же записывается миниатюра этого же изображения в директорию thumbs/. Далее на страничке, отсылающей изображение, я хотел выводить последние загруженные изображения пользователя.
0
1887 / 1491 / 687
Регистрация: 17.11.2012
Сообщений: 6,467
27.10.2015, 22:23 16
Цитата Сообщение от Roman2288 Посмотреть сообщение
в бд
тогда в чем проблема, достаете из базы данные последних изображений и выводите

Добавлено через 9 минут
Цитата Сообщение от Roman2288 Посмотреть сообщение
записывается в директорию files/ в папке сайта. Так же записывается миниатюра этого же изображения в директорию thumbs/
это сохраняются сами изображения. на ведь нужно их еще привязать к пользователю, как я понимаю. думаю в базе это как-то организовано. исходя из этого, достаем из базы данные изображений связанных с текущим пользователем и выводим. или я, что-то не так понял?
1
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
28.10.2015, 12:49  [ТС] 17
у меня картинки к пользователям не привязаны и они не хранятся в бд, но видимо надо будет сделать так. А пока они хранятся в 2 - ух директориях, и до этого выводились списком после загрузки через форму, в файле view_model.php
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
<?php
if ($handler = opendir('./files/')){ // открыли директорию для работы с файлами
    while(false !== ($entry = readdir($handler))){ //readdir вернет false если не нашел файла
        if($entry != '.' && $entry != '..'){ // . -> директория показывающая сама на себя, а .. -> директория уровнем выше
            ?><div>
                <a href="files/<?php echo $entry ; ?>"><img src='thumbs/<?php echo $entry ; ?>'/></a>
              </div><?php // просто выводим списком наши файлы
        }
    }
    closedir($handler); // закрыли директорию
}
а тут у меня вопрос стоял в том, чтобы выводить последние загруженные изображения на страничке с формой загрузки
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
28.10.2015, 12:58 18
HTML5
1
2
3
4
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" value="<?php echo $_SESSION['myfile']['name']; ?>" />
        <button type="submit">Загрузить</button>
    </form>
файл upload.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?
session_start();
$TypesImage = array('GIF','JPG','PNG','SWF','PSD','BMP','TIFF','TIFF','JPC','JP2','JPX');
if($_FILES['myfile']){
    $_SESSION['myfile']=$_FILES['myfile'];
    $img=getimagesize($_SESSION['myfile']['tmp_name']);
    if (!$_SESSION['myfile']['size']){ exit("Файл пустой!"); } 
    elseif($_SESSION['myfile']['error']){ exit($_SESSION['myfile']['error']); } 
    elseif(!$img){ exit("Данный тип файла запрещен!"); } 
    else {
        $filedirname = $_SERVER['DOCUMENT_ROOT'].'/files/';
        $thumbdirname = $_SERVER['DOCUMENT_ROOT'].'/thumbs/';
        $name = sha1_file($_SESSION['myfile']['tmp_name']); //sha1_file - хеширует целиком весь файл, имя файлы полностью хешированно
        $extention = $TypesImage[$img[2]];
        $filepath = $filedirname . $name . '.' . $extention;//basename - фильтрует имена полученных файлов, записывая только имя, без
        $thumbpath = $thumbdirname . $name . '.' .$extention;
        $result = move_uploaded_file($_SESSION['myfile']['tmp_name'], $filepath);//каких - либо спец символов
        if(!$result){
            echo "Ошибка перемещения файла";
            echo '<pre>'; print_r(error_get_last()); echo '</pre>';
            die();
        } else {
            try{
                $image = new Imagick($filepath);
                $image->setbackgroundcolor('rgb(255,255,255)');// задаем задний фон. В данном случае - белый
                $image->thumbnailImage(140,140,true,true);// благодаря двум true картинка всегда квадратная и дополняется белым цветом
                $result = $image->writeImage($thumbpath);// writeImage - записывает нашу картинку на диск
            
                if($result !== true){
                    echo "Ошибка при создании уменьшенной аватарки";
                    die();
                }
            }
            catch(exception $e){
                echo $e; //так не стоит делать, так как в логах может храниться очень приватная информация
                die();//убить процесс
            }
        }
        header('Location: view_model.php');
    }
}
else {
    echo "Вы не загрузили файл";
    echo '<br />' . '<a href = "look.htm">Назад</a>';
    }
?>
1
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 83
28.10.2015, 14:28  [ТС] 19
эти ошибки возникли после смены обработчика формы на upload.php
Warning: sha1_file(34bbfa64f7133a58662cc05f3a787640.jpg): failed to open stream: No such file or directory in D:\Server\OpenServer\domains\practice.ru\php\register\php\up load.php on line 19

Warning: move_uploaded_file(/files/.PNG): failed to open stream: No such file or directory in D:\Server\OpenServer\domains\practice.ru\php\register\php\up load.php on line 23

Warning: move_uploaded_file(): Unable to move 'D:\Server\OpenServer\userdata\temp\phpD0BB.tmp' to '/files/.PNG' in D:\Server\OpenServer\domains\practice.ru\php\register\php\up load.php on line 23
Ошибка перемещения файла
Array
(
[type] => 2
[message] => move_uploaded_file(): Unable to move 'D:\Server\OpenServer\userdata\temp\phpD0BB.tmp' to '/files/.PNG'
[file] => D:\Server\OpenServer\domains\practice.ru\php\register\php\up load.php
[line] => 23
)
при обработчике формы = model_session.php ошибка только такая -> Вы не загрузили файл
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 462
28.10.2015, 14:39 20
отсылай формой файл сразу на "мой" upload.php, минуя model_session.php
HTML5
1
<form action="upload.php" method="post" enctype="multipart/form-data">
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2015, 14:39

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Запись/чтение из файла
В общем! Скрипт записывает в файл... Но необходимо сделать так, чтобы он решал сам записывать...

Запись файла в UTF-8
Доброе утро! Сталкнулся с проблемой: не получается записать *.txt в кодировке UTF-8....

Чтение и запись файла
$ourfile = fopen(&quot;1.txt&quot;,&quot;a+&quot;); fwrite($ourfile,'Вы что все здесь, клоуны?'); rewind($ourfile); ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.