Проблемы с загрузкой файлов в PHP - PullRequest
0 голосов
/ 18 сентября 2010

Я пытаюсь загрузить файлы с помощью php, и он отлично работает до 1 Мб, я уже проверил форум и увидел, что обычно не хватает редактирования этих значений на php.ini (я используя WAMP):

post_max_size = 8G upload_max_filesize = 2G

Как вы можете видеть, я уже изменил их на Гигабайты, и все же это не работает, что происходит, когда я нажимаю на кнопку загрузки, она переходит в мой файл upload.php и просто висит там, ничего не записывая в БД.

У меня было это в моем HTML, но я уже прокомментировал это:

<!--input type="hidden" name="MAX_FILE_SIZE" value="20000000000" /-->

Мой php для загрузки:

<?php
include("mysql.class.php");
$mysql = new MySQL();
$tbl_name="documento";
session_start();

if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0){
    $fileName = $_FILES['userfile']['name'];
    $tmpName  = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];

    $fp      = fopen($tmpName, 'r');
    $content = fread($fp, filesize($tmpName));
    $content = addslashes($content);
    fclose($fp);
    $myusername=$_SESSION['myusername'];
    if(!get_magic_quotes_gpc()){
        $fileName = addslashes($fileName);
    }

    $query = "INSERT INTO $tbl_name (name, size, type, archivo,user_username ) ".
    "VALUES ('$fileName', '$fileSize', '$fileType', '$content','$myusername')";

    mysql_query($query) or die('Error, query failed'); 


    echo "<br>File $fileName uploaded<br>";
    header("location:admin.php");
} 
?>

Что мне здесь не хватает? Кроме того, когда я загружаю изображения (начиная со 180 КБ) и загружаю их, чтобы проверить, что они загружены правильно, я не могу видеть изображение, однако документы не имеют проблем.

Ответы [ 2 ]

4 голосов
/ 18 сентября 2010
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);

Вы экранируете содержимое файла.Это будет в основном причиной того, что изображение не отображается. Экранирование должно происходить, когда вы собираетесь отправлять данные на удаленные цели (используйте htmlentities() для отправки «текста» в браузер, используйте mysql_real_escape_string для отправки данных в базу данных MySQL).Вы должны посмотреть в руководстве по PHP , как правильно осуществить загрузку файлов.

При загрузке файлов в PHP следуйте следующим правилам:

  1. Проверказагружен файл или нет: isset($_FILES['userfile'])
  2. Проверьте, была ли загрузка файла успешной ($_FILES['userfile']['error'] === 0).Если нет, отобразите соответствующее сообщение об ошибке.См. на этой странице для возможных ошибок .
  3. Проверьте размер файла (максимальный размер): $_FILES['userfile']['size'] < 102400 (ограничивает размер файла до 100 КБ) (дополнительно проверьте, является ли файл пустым или нет, это зависит от вашего приложения)
  4. Если вы собираетесь использовать имя файла, очистите его, удалив запрещенные символы: $sanitizedFileName = preg_replace('#[^a-z0-9_-]#i', '', $_FILES['userfile']['name']);
  5. Проверьте расширение наОбеззараженное имя, независимо от того, разрешено оно или нет:

    $allowedExtensions = array('png', 'jpg', 'jpeg', 'txt', 'gif');
    $dotPos = strrchr($_FILES['userfile']['name'], '.');
    $ext = '';
    // Both FALSE and 0 will not match, I consider 'htaccess' in '.htaccess' not as an extension
    if($dotPos){
       // we are not interested whether the extension is in uppercase or lowercase
       $ext = strtolower(substr($_FILES['userfile']['name'], $dotPos));
    }
    if(!in_array($ext, $allowedExtensions)){
       echo 'Extension not allowed';
    }
    else{
       // continue with uploading
    }
    
  6. При необходимости используйте функции изображения для проверки изображения и ограничьте размер (ширина x высота) с помощью getimagesize ().

  7. Используйте move_uploaded_file($_FILES['userfile'], "$targetDir/$sanitizedFileName") или сохраните содержимое (file_get_contents($_FILES['userfile']['tmp_name'])) в базе данных.При хранении в базе данных не забывайте экранировать ваши данные.
0 голосов
/ 18 сентября 2010

Я думаю, это как-то связано с вашим addslashes($content) утверждением.Как сказал Лекенштейн, это может привести к повреждению двоичных данных (например, в изображении).Вместо использования addslashes() посмотрите на функцию PHP mysql_real_escape_string().

Кроме того, я не думаю, что в большинстве случаев считается оптимальной практикой хранения таких данных, какзагрузка файлов в базу данных.Вы должны сохранить файл на диске и просто сохранить его имя в базе данных.Хранение файлов до 2 ГБ в вашей базе данных создаст ненужную нагрузку для вашего сервера MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...