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. teddy - 25 Мая, 2013 - 02:40:27 - перейти к сообщению
Здравствуйте уважаемые форумчане. Столкнулся с проблемой при загрузки файлов на сервер. При добавлении файла получаю тип: Array ( [name] => original.jpg [type] => image/pjpeg [tmp_name] => Z:\tmp\php1797.tmp [error] => 0 [size] => 60198 ) - как можно сделать, что бы можно было убрать p перед .jpg? А то оно мне всю проверку портит. Вот код, на всякий случай. Благодарю заранее

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function isSecurity($file){
  3.         $name = $file["name"];
  4.         $type = $file["type"];
  5.         $size = $file["size"];
  6.         $blacklist = array(".php", ".phtml", ".php3", ".php4");
  7.         foreach($blacklist as $item){
  8.          if(preg_match("/$item\$/i", $name)) return false;
  9.          
  10.    if(($type != "image/gif") && ($type != "image/png") && ($type != "image/jpg") && ($type != "image/jpeg")) return false;
  11.    if($size > 5*1024*1024) return false;
  12.    else
  13.    return true;  
  14.          
  15. }
  16.  
  17.  
  18. }
  19. function loadFile($file){
  20.         $type = $file['type'];
  21.         $dir = "files/";
  22.  
  23.         $name = md5(microtime()).".".substr($type, strlen("image/"));
  24.         $uploadfile = $dir.$name;
  25.         if(move_uploaded_file($file["tmp_name"], $uploadfile)){
  26.         return true;
  27.  
  28. }else return false;
  29. }
  30. if(isset($_POST['addfile'])){
  31.         $file = $_FILES['file'];
  32.         print_r($file);
  33.         if(isSecurity($file)) loadFile($file);
  34.         else
  35.         echo "Неверный формат файла";
  36. }
  37.  
  38.  
  39. ?>
  40. <form action="file.php" method="post" enctype="multipart/form-data">
  41. <input type="file" name="file"><br>
  42. <input type="submit" name="addfile" value="Add">
2. DeepVarvar - 25 Мая, 2013 - 06:12:29 - перейти к сообщению
Вот например первая ссылка в выдаче гугла по запросу image/pjpeg: http://web[dot]izjum[dot]com/ie-mime-type-pjpeg

Я пошел смотреть что у меня с этим.
А у меня с этим все нормально.
Тут видно, что у одного контейнера не обязательно одно возможное расширение файла.
Кроме того одно и то же расширение может быть обернуто в разные контейнеры.
Твой pjpeg там тоже присутствует:
PHP:
скопировать код в буфер обмена
  1. $filetypes = array(
  2.  
  3.   "image/bmp"           => array("bm", "bmp"),
  4.   "image/x-windows-bmp" => array("bm", "bmp"),
  5.   "image/gif"           => array("gif"),
  6.   "image/jpeg"          => array("jpe", "jpg", "jpeg"),
  7.   "image/pjpeg"         => array("jpg"),
  8.   "image/png"           => array("png", "x-png"),
  9.   "image/x-png"         => array("png"),
  10.   "image/svg+xml"       => array("svg", "svgz")
  11.  
  12. );
3. teddy - 25 Мая, 2013 - 10:43:06 - перейти к сообщению
DeepVarvar
Спасибо большое, ответ реально помог ) По правде говоря прежде вообще не слышал про pjpeg и думал, что проблема в коде. Дело в том, что при минимальном наборе кода, которого достаточно для загрузки файла на сервер, все файлы, в том числе и тот же jpg загружался нормально, а после проверок уже менялся формат...
(Добавление)
Появилась необходимость аналогичного скрипта но с возможностью загружать только word документы. Но почему то получаю ошибку, изменил только 1 строку в коде, а именно типы.

PHP:
скопировать код в буфер обмена
  1. if(($type != "application/msword")) return false;
  2.  


Результат var_dump

array(5) { ["name"]=> string(11) "test.doc" ["type"]=> string(18) "application/msword" ["tmp_name"]=> string(18) "Z:\tmp\php17C5.tmp" ["error"]=> int(0) ["size"]=> int(28672) }

Вот собственно и ошибка. В гугле найти не смог, к сожалению.

Warning: move_uploaded_file(files/ation/msword) [function.move-uploaded-file]: failed to open stream: No such file or directory in Z:\home\test1.ru\www\file.php on line 25

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'Z:\tmp\php17C7.tmp' to 'files/ation/msword' in Z:\home\test1.ru\www\file.php on line 25

Походу там проблемы с названием. Не пойму из за чего? Другие файлы норм подгружаются, если формат не соответствует, то значит всплывает ошибка типа "Неверный формат файла". А здесь почему то на уровне php. Вроде обычная проверка, скрипт рабочий, не пойму... Буду признателен если поможете
4. DeepVarvar - 25 Мая, 2013 - 11:45:00 - перейти к сообщению
Так проверь что там в названии - var_dump() все скажет.
5. teddy - 25 Мая, 2013 - 11:49:21 - перейти к сообщению
DeepVarvar
Я же отправил результат дампа. Исходя из ошибки как я понял php расценивает это дело "application/msword" не как формат а как директорию. А почему при загрузке картинок было не так? Ведь там тоже image/gif, например...
6. DelphinPRO - 25 Мая, 2013 - 12:16:01 - перейти к сообщению
teddy пишет:
$name = md5(microtime()).".".substr($type, strlen("image/"));

а здесь image/ на application/ заменили?
7. teddy - 25 Мая, 2013 - 17:19:16 - перейти к сообщению
DelphinPRO
Точно... спасибо ) Улыбка

Надо же так тупануть Не понял
8. Andrew_li - 30 Мая, 2013 - 07:04:44 - перейти к сообщению
Доброго дня, не буду создавать тему, так как вопрос по теме.
Загрузчик загружает файл, но когда скачиваешь файл, то на деле файл скачивается поврежденный, файлы вордовские
Когда файл открываешь, там кракозябры, подскажите что может быть.

Вот код для скачки
PHP:
скопировать код в буфер обмена
  1. if(isset($_GET['downloadid']) AND !empty($_GET['downloadid']))
  2. {
  3.   $_GET['downloadid'] = intval($_GET['downloadid']);
  4.  
  5.   $sql = "SELECT * FROM `tezis` WHERE `id`='{$_GET['downloadid']}' AND `person_id`='{$_SESSION['person_id']}';";
  6.   $res = $DB->sql_query($sql, "Запрос прикрепленного файла.");
  7.  
  8.   if($DB->sql_numrows($res))
  9.   {
  10.     $tez = $DB->sql_fetchrow($res);
  11.  
  12.     if(file_exists($_SERVER["DOCUMENT_ROOT"] . '/personal/files/'. $doc['id']))
  13.     {
  14.       header("HTTP/1.0 200 OK");
  15.       header("Content-type: application/data-stream");
  16.       header("Content-disposition: attachment; filename=\"{$doc['file_name']}\"");
  17.       @readfile($_SERVER["DOCUMENT_ROOT"] . '/personal/files/'. $doc['id']);
  18.       exit();
  19.     }
  20.   }
  21.   else header('Location: '. $_SERVER['SCRIPT_NAME']);
  22. }


Файлы в каталог загружаются нормально, если их сказать по ftp и дописать расширение, то файл открывается без проблем, подскажите что может быть?
9. Andrew_li - 04 Июня, 2013 - 12:38:22 - перейти к сообщению
Все дело было в заголовках
PHP:
скопировать код в буфер обмена
  1.  
  2. header("HTTP/1.0 200 OK");
  3. header("Content-Description: File Transfer");
  4. header("Content-type: application/octet-stream");
  5. header("Content-disposition: attachment; filename=\"{$doc['file_name']}\"");
  6. header("Content-Length: " . $fsize);
  7.  

 

Powered by ExBB FM 1.0 RC1