Загрузка картинки на сервер
Нигде не могу найти примера загрузки картинки на сервер не из формы, а из POST запроса. Помогите переделать этот пример с php.net:
'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) < echo "Файл корректен и был успешно загружен.\n"; >else < echo "Возможная атака с помощью файловой загрузки!\n"; >echo 'Некоторая отладочная информация:'; print_r($_FILES); print "
"; ?>
Отслеживать
задан 7 сен 2016 в 19:02
Никола Кривошея Никола Кривошея
1,497 4 4 золотых знака 34 34 серебряных знака 71 71 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Форма это набор именованных данных, POST/GET/PUT/DELETE/REQUEST — методы передачи данных. Передача в основном идет через тело запроса (ваш POST), или параметры запроса (GET — через него файл не получиться передать). Форма лишь помогает Вам удобно загрузить файл через POST метод на сервер. Вам требуется обязательно почитать про передачу параметров извне
Приведенный пример загрузки файла корректный. Передача файла из формы/запроса будет осуществляться методом POST. В данном примере есть свои проблемы, например нет функции is_uploaded_file, которая проверяет что файл загружен или нет проверки, что загружается именно картинка, в коде ниже реализовал данную проверку.
//Проверка что это картинка if (!getimagesize($_FILES["userfile"]["tmp_name"])) < echo "Это не картинка. "; die(); //or throw exception. >if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) < echo "Файл корректен и был успешно загружен.\n"; >else < echo "Возможная атака с помощью файловой загрузки!\n"; >?>
Чтобы передать данные скрипту нужно создать форму на HTML с enctype=»multipart/form-data»
Select image to upload:
Если вы хотите отправлять данные без браузера, можете воспользоваться CURL. Запуск POST запроса из командной строки для передачи файла выглядит вот так:
curl -i -X POST -H "Content-Type: multipart/form-data" -F "[email protected]" http://myserver/upload
PHP – Загрузка файлов на сервер своими руками
Рад видеть Вас на страницах своего сайта. Сегодня поговорим о реализации загрузки файлов на сервер. Тема довольно интересная т.к. многих новичков интересует данный вопрос.
Загрузка файлов на сервер средствами PHP значительно облегчит Ваш труд по наполнению фотогалереи или оформления страницы сайта при помощи редактора (например TinyMCE). Также Вы можете загружать любые типы файлов на сервер исходя из Ваших задач.
Для того чтобы загрузить файл на сервер нужно создать форму для загрузки файлов. В принципе данная форма не очень сильно отличается от обычной формы с текстовыми полями, за исключением, что type будет не text, а file (так как мы грузим файлы) и в самой форме добавится атрибут enctype=»multipart/form-data». Entype определяет вид кодировки, которую браузер применяет к параметрам формы.
PHP - Загрузка файлов на сервер своими руками #wrap < width:400px; height:100%; display:block; margin:0 auto; >h2 Демо: Загрузка файлов на сервер
Загрузите ваши фотографии на сервер
Форму загрузки файлов мы сделали, самое время написать простой обработчик для загрузки файлов на сервер. Определим сразу, что грузить будем только графические файлы с типом jpeg, png, gif. После того как мы определили типы файлов для загрузки на сервер, нам нужно создать папку на самом сервере, куда мы будем складывать наши файлы. В моем примере это папка image, в нее мы будем складывать наши файлы.
'Ошибок не возникло, файл был успешно загружен на сервер. ', 1 => 'Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.', 2 => 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.', 3 => 'Загружаемый файл был получен только частично.', 4 => 'Файл не был загружен.', 6 => 'Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP 5.0.3.' ); //Определяем типы файлов для загрузки $fileTypes = array( 'jpg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif' ); //Если нажата кнопка загрузить if(isset($_POST['upload'])) < //Проверяем пустые данные или нет if(!empty($_FILES)) < //Проверяем на ошибки if($_FILES['files']['error'] >0) $err[] = $errUpload[$_FILES['files']['error']]; //Проверям тип файла для загрузки if(!in_array($_FILES['files']['type'], $fileTypes)) $err[] = 'Данный тип файла '. $_FILES['files']['type'] .' не подходит для загрузки!'; //Если нет ошибок то грузим файл if(empty($err)) < $type = pathinfo($_FILES['files']['name']); $name = $uploadDir .'/'. uniqid('files_') .'.'. $type['extension']; move_uploaded_file($_FILES['files']['tmp_name'],$name); //Сбрасываем POST параметры header('Location: http://'. $_SERVER['HTTP_HOST'] .'/less/uploads/uploads.php?name='. $name); exit; >else echo implode('
', $err); > > //Сообщение об успешной загрузке файла на сервер if(isset($_GET['name'])) echo 'Файл '. htmlentities($_GET['name']) .' успешно загружен!
'; //Выводим картинки из каталога $imgDir = array_values(array_diff(scandir($uploadDir), array('..', '.'))); for($i = 0; $i < count($imgDir); $i++) < if($i % 2 == 0) echo '
'."\n"; echo '
'."\n"; > echo '
'."\n"; echo ' http://'. $_SERVER['HTTP_HOST'] .' '; ?>
После того как мы написали код, проверили что все работает, новичок может столкнутся с проблемой загрузки больших файлов. Для это нужно поправить настройки в PHP.INI
Настройки PHP для загрузки файла
| max_execution_time = 3000 | ; Максимальное время выполнения каждого скрипта в секундах |
| max_input_time = 400 | ; Максимальная количество времени каждый сценарий может потратить разбора запроса данных |
| memory_limit = 500M | ; Максимальный объем памяти, скрипт может потреблять (8 МБ) |
| post_max_size = 500M | ; Максимальный размер данных POST, что PHP будет принимать. |
| upload_max_filesize = 200M | ; Максимально допустимый размер для загружаемых файлов. |
Как загрузить картинку на сервер php
I think the way an array of attachments works is kind of cumbersome. Usually the PHP guys are right on the money, but this is just counter-intuitive. It should have been more like:
Array
(
[0] => Array
(
[name] => facepalm.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpn3FmFr
[error] => 0
[size] => 15476
)
Anyways, here is a fuller example than the sparce one in the documentation above:
foreach ( $_FILES [ «attachment» ][ «error» ] as $key => $error )
$tmp_name = $_FILES [ «attachment» ][ «tmp_name» ][ $key ];
if (! $tmp_name ) continue;
$name = basename ( $_FILES [ «attachment» ][ «name» ][ $key ]);
if ( $error == UPLOAD_ERR_OK )
if ( move_uploaded_file ( $tmp_name , «/tmp/» . $name ) )
$uploaded_array [] .= «Uploaded file ‘» . $name . «‘.
\n» ;
else
$errormsg .= «Could not move uploaded file ‘» . $tmp_name . «‘ to ‘» . $name . «‘
\n» ;
>
else $errormsg .= «Upload error. [» . $error . «] on file ‘» . $name . «‘
\n» ;
>
?>
7 years ago
Do not use Coreywelch or Daevid’s way, because their methods can handle only within two-dimensional structure. $_FILES can consist of any hierarchy, such as 3d or 4d structure.
The following example form breaks their codes:
As the solution, you should use PSR-7 based zendframework/zend-diactoros.
use Psr\Http\Message\UploadedFileInterface ;
use Zend\Diactoros\ServerRequestFactory ;
$request = ServerRequestFactory :: fromGlobals ();
if ( $request -> getMethod () !== ‘POST’ ) http_response_code ( 405 );
exit( ‘Use POST method.’ );
>
$uploaded_files = $request -> getUploadedFiles ();
if (
!isset( $uploaded_files [ ‘files’ ][ ‘x’ ][ ‘y’ ][ ‘z’ ]) ||
! $uploaded_files [ ‘files’ ][ ‘x’ ][ ‘y’ ][ ‘z’ ] instanceof UploadedFileInterface
) http_response_code ( 400 );
exit( ‘Invalid request body.’ );
>
$file = $uploaded_files [ ‘files’ ][ ‘x’ ][ ‘y’ ][ ‘z’ ];
if ( $file -> getError () !== UPLOAD_ERR_OK ) http_response_code ( 400 );
exit( ‘File uploading failed.’ );
>
$file -> moveTo ( ‘/path/to/new/file’ );
7 years ago
The documentation doesn’t have any details about how the HTML array feature formats the $_FILES array.
Example $_FILES array:
For single file —
Array
(
[document] => Array
(
[name] => sample-file.doc
[type] => application/msword
[tmp_name] => /tmp/path/phpVGCDAJ
[error] => 0
[size] => 0
)
)
Multi-files with HTML array feature —
Array
(
[documents] => Array
(
[name] => Array
(
[0] => sample-file.doc
[1] => sample-file.doc
)
[type] => Array
(
[0] => application/msword
[1] => application/msword
)
[tmp_name] => Array
(
[0] => /tmp/path/phpVGCDAJ
[1] => /tmp/path/phpVGCDAJ
)
The problem occurs when you have a form that uses both single file and HTML array feature. The array isn’t normalized and tends to make coding for it really sloppy. I have included a nice method to normalize the $_FILES array.
function normalize_files_array ( $files = [])
foreach( $files as $index => $file )
if (! is_array ( $file [ ‘name’ ])) $normalized_array [ $index ][] = $file ;
continue;
>
foreach( $file [ ‘name’ ] as $idx => $name ) $normalized_array [ $index ][ $idx ] = [
‘name’ => $name ,
‘type’ => $file [ ‘type’ ][ $idx ],
‘tmp_name’ => $file [ ‘tmp_name’ ][ $idx ],
‘error’ => $file [ ‘error’ ][ $idx ],
‘size’ => $file [ ‘size’ ][ $idx ]
];
>
?>
The following is the output from the above method.
Array
(
[document] => Array
(
[0] => Array
(
[name] => sample-file.doc
[type] => application/msword
[tmp_name] => /tmp/path/phpVGCDAJ
[error] => 0
[size] => 0
)
[documents] => Array
(
[0] => Array
(
[name] => sample-file.doc
[type] => application/msword
[tmp_name] => /tmp/path/phpVGCDAJ
[error] => 0
[size] => 0
)
[1] => Array
(
[name] => sample-file.doc
[type] => application/msword
[tmp_name] => /tmp/path/phpVGCDAJ
[error] => 0
[size] => 0
)
Загружаем файл на сервер
Создадим таблицу для картинок. Мы не будем хранить картинки в БД, так как это существенно увеличивает ее размер и замедляет работу. При загрузке файла будем сохранять его имя в БД.
Множественная загрузка
То есть к имени файла добавляется []. Для множественной загрузки добавляем multiple=”true”.
$_FILES[‘userfile’][‘name’] – содержит массив имен всех загруженных файлов
$_FILES[‘userfile’][‘name’][0] – доступ к нулевому элементу
count($_FILES[‘userfile’][‘name’]) — возвращает количество загруженных файлов
Полезное чтиво:
- Безопасная загрузка изображений на сервер, часть первая https://habr.com/ru/post/44610/
- Безопасная загрузка изображений на сервер, часть вторая https://habr.com/ru/post/44615/
Практика
- Загружаем картинку на сервер
- При загрузке, выводим список ранее загруженных картинок(добавляем БД)
- Обеспечиваем уникальность имен файлов и «защиту от просмотров»
- Мультизагрузка
