2010-09-18 3 views
0

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

post_max_size = 8G upload_max_filesize = 2G

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

Я имел это в моем HTML, но я заметил это уже:

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

мой загрузки РНР:

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

+0

Почему вы пытаетесь добавить косые черты в содержимое файлов? – NullUserException

+0

Вот как меня научили делать, не так ли? – Tsundoku

+0

Кроме того, почему вы храните содержимое в базе данных? – NullUserException

ответ

4
$fp = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 

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

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

  1. Проверка является закачанный ли файл или нет: isset($_FILES['userfile'])
  2. Проверьте, была ли загрузка файлов успешно ($_FILES['userfile']['error'] === 0). Если нет, отобразите соответствующее сообщение об ошибке. См. this page for possible errors.
  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. Необязательно использовать функции изображения для проверки изображения, и ограничить размерность (wi dth x height) с getimagesize().

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

Он добавляет косые черты, потому что пытается остановить атаки SQL-инъекций. Люди с добрыми намерениями, которые никогда не слышали о http://uk.php.net/manual/en/function.mysql-real-escape-string.php, делают это. Не нужно ругаться. Просто исправьте их вежливо (но довольно срочно). – James

+0

Я уже заметил, что это попытка избежать данных для базы данных. Но это неправильный способ сделать это. Теперь я уделяю больше внимания ускользающей части. – Lekensteyn

+0

Мне понравилось, когда он начинался с «Что, черт возьми, ты делаешь» – NullUserException

0

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

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

Смежные вопросы