Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Размер файлов в массиве?
Форумы портала PHP.SU » » Вопросы новичков » Размер файлов в массиве?

Страниц (1): [1]
 

1. alexpebody - 03 Июня, 2016 - 11:04:09 - перейти к сообщению
Доброго всем времени.

Подскажите, что то никак найти зацепку не могу, есть код (куском):

index.html
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <input type="file" size="32" name="xtt[]">
  3.  


Выглядит вот так (кто не понял о чем я):


upload.php
PHP:
скопировать код в буфер обмена
  1.  
  2. if($_FILES['xtt']['size'][0] > 1024*1024*1024) exit();
  3.  


Но прикол в том, что $_FILES['xtt']['size'][0] определяет только вхождение и размер первого файла в массиве $_FILES, соответственно считывает размер только первого файла, к примеру: 1й файл который мы загружаем в форме = 1МБ, 2й = 1000МБ, в итоге ограничение не сработает, тк $_FILES['xtt']['size'][0] видит только 1МБ первого файла.

Как показать размер всех файлов в массиве, чтобы узнать размер каждого и если размер любого больше 1ГБ, то exit();

Заранее СПАСИБО!


З.Ы. Искал всяко, но кроме функций на $_FILES ничего толком.
2. OrmaJever - 03 Июня, 2016 - 11:06:39 - перейти к сообщению
alexpebody пишет:
$_FILES['xtt']['size'][0]

вы точно ничего не напутали? по-моему должно быть так
$_FILES['xtt'][0]['size']
а по сути дела
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt'] as $file) {
  2.    if($file['size'] > 1024*1024*1024) exit();
  3. }
3. alexpebody - 03 Июня, 2016 - 11:07:37 - перейти к сообщению
OrmaJever пишет:
вы точно ничего не напутали?


Проверил, не показывает размера совсем не видит:
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt'] as $file) {
  2.         echo $file['size'];
  3. }


Дает ошибку: Notice: Undefined index: size

, не видит элементов в массиве $_FILES['xtt'], дело в том, что загружается пачка файлов, мне нужно проверить размер каждого файла в этом массиве, как пока не соображу. Может что то путаю, подскажите? Спасибо!

Т.е.: $_FILES['xtt']['size'][0] только так начинает видить 1й файл и его размер, вот так $_FILES['xtt']['size'] - не видит размера вообще (

Еще конкретнее постараюсь задать вопрос: Как узнать размер каждого файла в массиве $_FILES, при MultiPart загрузке файлов и соответственно проверить условием?

OrmaJever пишет:
$_FILES['xtt'][0]['size']

Так, тоже не видит размера совсем, те пусто в переменной.
4. OrmaJever - 03 Июня, 2016 - 11:33:58 - перейти к сообщению
может я ошибся, и вправду должно быть $_FILES['xtt']['size'][0], тогда будет так
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt']['size'] as $size) {
  2.    if($size > 1024*1024*1024) exit();
  3. }
5. alexpebody - 03 Июня, 2016 - 11:37:04 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt']['size'] as $size) {
  2. echo $size;
  3. }


Показывает только 1е вхождение, те считает только 1й файл также как и у меня. А мне нужно как то показать размер каждого файла? Как это можно сделать?

Если выбирается 1й файл = 10МБ, а второй скажем 50МБ, скрипт считает только 1й, соответственно условие будет ложным, тк считает и смотрит только на 1й файл.

Вот пример отображения:

Загружаю 2 разных файла, но размер показывает один и тот же, те размер первого файла.

З.Ы. В идеале, условие такое: если любой из файлов в массиве больше 1ГБ, тогда exit();

Глупо конечно, но может смотреть на сессию в папку: $_FILES['userfile']['tmp_name'] но это через чур как по мне. Есть хоть какие то идеи?
6. andrewkard - 03 Июня, 2016 - 11:47:25 - перейти к сообщению
alexpebody
Что тут приходит?
7. alexpebody - 03 Июня, 2016 - 11:49:21 - перейти к сообщению
andrewkard пишет:
Что тут приходит?


Array ( [xtt] => Array ( [name] => Array ( [0] => EverlastingSummer.jpg [1] => InetPrivozMap.png ) [type] => Array ( [0] => image/jpeg [1] => image/png ) [tmp_name] => Array ( [0] => ...temp\php16DC.tmp [1] => ...temp\php16FC.tmp ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 301522 [1] => 264833 ) ) )
...files/nx99jueverlastingsummer .jpg
Array ( [xtt] => Array ( [name] => Array ( [0] => EverlastingSummer.jpg [1] => InetPrivozMap.png ) [type] => Array ( [0] => image/jpeg [1] => image/png ) [tmp_name] => Array ( [0] => ...temp\php16DC.tmp [1] => ...temp\php16FC.tmp ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 301522 [1] => 264833 ) ) )
...files/a4av85inetprivozmap.png

з.ы. Загружаю 2 файла разного размера:
EverlastingSummer.jpg
InetPrivozMap.png

Через MultiPart
8. Viper - 03 Июня, 2016 - 11:50:22 - перейти к сообщению
alexpebody пишет:
при MultiPart загрузке файлов
шта? Может всё же chunked?
И приведите уже HTML-код формы, а не одного инпута.
PHP:
скопировать код в буфер обмена
  1. echo '<pre>';
  2. print_r($_FILES);
  3. echo '</pre>';
помогает перестать фантазировать.
9. alexpebody - 03 Июня, 2016 - 11:54:00 - перейти к сообщению
Viper пишет:
помогает перестать фантазировать.


Viper пишет:
И приведите уже HTML-код формы, а не одного инпута.

Конечно, если нужно:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <form action="upload.php" method="post" name="form" ENCTYPE="multipart/form-data">
  3. <input type="file" size="32" name="xtt[]">
  4. <input name="" type="submit" onclick="this.disabled='disabled'; document.forms.item(0).submit();" onmousedown="openbox('box')"; value="Нажмите для загрузки файлов на сервер"></p></form>

PHP:
скопировать код в буфер обмена
  1. move_uploaded_file($_FILES['xtt']['tmp_name'], $uploadfile);
  2.  


Вот по сути весь код операции, очень простой. Но суть проблемы узнать размер каждого файла в массиве MultiPart, а показывает в лучшем случае только первый. (

З.Ы. Из картинки приведенной выше, я вижу вхождение как и должно быть: [0] = 1й файл, [1] = 2й файл, но как написать условие? Может кто то подсказать? Как показать все размеры всех файлов в массиве, ведь сколько их загрузит пользователь мы не знаем (( те надо как то проверять длину массива ( не совсем понимаю...

Как бы я не пробовал и так:
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt']['size'] as $fname){
  2. echo $fname;
  3. }

и так:
PHP:
скопировать код в буфер обмена
  1. echo $_FILES['xtt']['size'][0];
  2. echo $_FILES['xtt']['size'][1];


Показывает размер только первого файла в массиве Огорчение
10. Viper - 03 Июня, 2016 - 12:34:15 - перейти к сообщению
alexpebody не заливайте картинки на говнокал.сру! Он не у всех работает(да и желания нет). Прикрепляйте к посту!
11. alexpebody - 03 Июня, 2016 - 12:35:21 - перейти к сообщению
Viper пишет:
alexpebody не заливайте картинки на говнокал.сру! Он не у всех работает(да и желания нет). Прикрепляйте к посту!

Без проблем, сейчас переделаю. Привычка.

PHP 5.5 на хосте:
PHP:
скопировать код в буфер обмена
  1. echo $_FILES['xtt']['size'][0];
  2. echo $_FILES['xtt']['size'][1];


Начал показывать:
301522
264833
...files/sol174everlastingsummer .jpg
301522
264833
...files/3ye4i7inetprivozmap.png

Кто может, подскажите, как написать условие: если хотя бы один файл в массиве превышает 1ГБ, то exit(); ?
12. Viper - 03 Июня, 2016 - 12:46:55 - перейти к сообщению
multiple инпуту допишите
13. alexpebody - 03 Июня, 2016 - 12:48:45 - перейти к сообщению
Viper пишет:
multiple инпуту допишите

Ок, сделано, а как написать условие: если хотя бы один файл в массиве превышает 1ГБ, то exit();
14. Viper - 03 Июня, 2016 - 12:51:00 - перейти к сообщению
http://php.net/manual/en/functio...esize.php#115792 функция для проверки размера. Желательно её, т.к. у вас по виду могут большое файло заливать.

http://forum.php.su/topic.php?fo...42838#1464942838 уже готово.
15. alexpebody - 03 Июня, 2016 - 12:53:39 - перейти к сообщению
Большое спасибо, если сделать вот так:
PHP:
скопировать код в буфер обмена
  1. foreach($_FILES['xtt']['size'] as $size) {
  2.    if($size > 1024*1024*1024) exit();
  3. }


Вроде работает! Радость

 

Powered by ExBB FM 1.0 RC1