PHP загрузить файл в базу данных не работает с GIF, JPEG и другими типами файлов - PullRequest
2 голосов
/ 12 февраля 2012

У меня проблема с неработающим PHP / MySQL. Я могу загружать файлы, такие как .docx и .sql, но когда я пытаюсь использовать .gif, .jpg .zip и .rar, это не работает.

Вот код формы загрузки:

<?php 
if (isset($_GET['uploadError']))
{
    echo '<div id="error">There was an error uploading the file. Please try again</div>';
}
elseif ((!isset($_SESSION['dbusername']))&&(!isset($_SESSION['dbpassword'])))
{
    header('Location: ?page=login&uploadAttempt=true&attemptedSite=upload');
}
else
{
    echo '
    <center>
    <form class="form" enctype="multipart/form-data" action="uploadaction.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="30720" />
    <p class="uploadfile">
        <input name="uploadedfile" type="file" />
    </p>
    <p class="submit">
        <input type="hidden" name="upload" value="start" />
        <input type="submit" value="Upload File" />
    </p>
    </form></center>';
}
?>

Вот код uploadaction.php:

    <?php
require('lib.php');
localhost_con('filehunt');
session_start();

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

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

    if(!get_magic_quotes_gpc())
    {
        $fileName = addslashes($fileName);
    }
    /*$fh = fopen($_FILES['uploadedfile']['tmp_name'], 'r');
    $theData = fread($fh, filesize($_FILES['uploadedfile']['tmp_name']));
    $theData = mysql_real_escape_string($theData);
    fclose($fh); */
    $date = date("y/m/d : H:i:s", time());

    $sql = "INSERT INTO files (rowID, file, mimetype, data, uploaded_by, uploaded_date, size, times_downloaded) 
    VALUES (NULL, '$fileName', '$fileType', '$content', '$user', '$date', $fileSize, 0);";

    if (mysql_query($sql,$con))
    {
        header('Location: index.php?page=search&uploadSucces=true');
    } 
    else echo mysql_error();
}
else header('Location: index.php?page=upload&uploadError=true');

?>

Вставляется в базу данных, но столбец mimetype и data пуст. Может кто-нибудь сказать мне, почему это происходит, и как это исправить?

Заранее спасибо Адам

Ответы [ 2 ]

1 голос
/ 24 августа 2012

У меня была такая же проблема с другими типами файлов. Обходной путь - это кодирование файла с base64, который безопаснее передавать (не содержат недопустимых символов, которые могут обрезать потоковую передачу).

0 голосов
/ 14 февраля 2012

Не совсем уверен, но это:

$fileType = $_FILES['uploadedfile']['type'];

должно быть так:

$finfo = new finfo();
$fileType = $finfo->file($_FILES['uploadedfile']['tmp_name'], FILEINFO_MIME);
...