Проблемы с загрузкой файлов в PHP

Я пытаюсь загрузить файлы с помощью 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 КБ) и загружаю их, чтобы проверить, правильно ли они загружены, я не могу видеть изображение, но с документами проблем нет.


person Tsundoku    schedule 18.09.2010    source источник
comment
Почему вы пытаетесь добавить косую черту к содержимому файлов?   -  person NullUserException    schedule 18.09.2010
comment
просто меня так учили, разве это не правильно?   -  person Tsundoku    schedule 18.09.2010
comment
Кроме того, почему вы храните содержимое в базе данных?   -  person NullUserException    schedule 18.09.2010
comment
потому что они позже будут использоваться другими пользователями, я полагаю, вы имеете в виду вместо того, чтобы просто загружать их через FTP?   -  person Tsundoku    schedule 18.09.2010
comment
@Luis См. это: stackoverflow.com/questions/3401761/   -  person NullUserException    schedule 18.09.2010
comment
хахаха, я этого не знал, хорошо, так что я посмотрю, как это сделать   -  person Tsundoku    schedule 18.09.2010
comment
@NullUserException Он добавляет косые черты, потому что пытается остановить атаки SQL-инъекций. Правильная вещь, за исключением того, что вы должны использовать uk.php .net/manual/en/function.mysql-real-escape-string.php не добавляет косые черты. Но лучше хранить прикрепленные файлы в файловой системе.   -  person James    schedule 18.09.2010
comment
Кстати, отдавать PHP 8 ГБ данных — не лучшая идея. FTP не вариант?   -  person Lekensteyn    schedule 18.09.2010
comment
Я только что поставил 8Gb, потому что думал, что это проблема, но теперь кажется, что у меня в основном все не так =/ поэтому я переделаю все, что вы, ребята, сказали мне здесь.   -  person Tsundoku    schedule 18.09.2010
comment
Никогда не делайте таких вещей, как установка ограничения на 8 ГБ. Я не думаю, что у вашего сервера столько памяти. Прежде чем изменить такую ​​настройку, проведите небольшое исследование: что произойдет, если я изменю это значение? Debian допустил известную ошибку с SSL в этом способ.   -  person Lekensteyn    schedule 18.09.2010


Ответы (2)


$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 высота) с помощью получить размер изображения().

  7. Используйте move_uploaded_file($_FILES['userfile'], "$targetDir/$sanitizedFileName") или сохраните содержимое (file_get_contents($_FILES['userfile']['tmp_name'])) в базе данных. При сохранении в базе данных не забудьте экранировать ваши данные.
person Lekensteyn    schedule 18.09.2010
comment
Он добавляет косые черты, потому что пытается остановить атаки SQL-инъекций. Люди с добрыми намерениями, которые никогда не слышали о uk.php .net/manual/en/function.mysql-real-escape-string.php сделайте это. Не нужно ругаться. Просто исправьте их вежливо (но достаточно срочно). - person James; 18.09.2010
comment
Я уже заметил, что это была попытка скрыть данные для базы данных. Но это неправильный способ сделать это. Теперь я уделил больше внимания побегу. - person Lekensteyn; 18.09.2010
comment
Мне больше нравилось, когда оно начиналось с «Что, черт возьми, ты делаешь?» - person NullUserException; 18.09.2010
comment
Вы всегда можете просмотреть историю изменений для этого :-) - person Lekensteyn; 18.09.2010

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

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

person Sam    schedule 18.09.2010