无法在PHP中上传文件

时间:2010-09-18 15:59:33

标签: php file-upload

我正在尝试使用php上传文件,它完美地工作到1Mb,我已经checked the forum并且发现缺少的常见事情是在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");
} 
?>

我在这里缺少什么?此外,当我上传图像(自180kbs)并下载它们以检查它们是否正确上传后,我无法看到图像,但文档没有问题。

2 个答案:

答案 0 :(得分:4)

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

您正在转义文件的内容。这主要是导致图像无法显示的原因。 当你要将数据发送到远程目标时应该进行转义(使用htmlentities()向浏览器发送'text',使用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 kB) (可选择检查文件是否为空,这取决于您的应用程序)
  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. (可选)使用图像功能验证图像,并使用getimagesize()限制尺寸(宽x高)。

  7. 使用move_uploaded_file($_FILES['userfile'], "$targetDir/$sanitizedFileName")或将内容(file_get_contents($_FILES['userfile']['tmp_name']))存储在数据库中。 存储在数据库中时,请不要忘记escape您的数据。

答案 1 :(得分:0)

我的猜测是它与你的addslashes($content)声明有关。正如lekensteyn所说,这可能导致二进制数据(例如图像中)被破坏。不要使用addslashes(),而是查看PHP的mysql_real_escape_string()函数。

此外,在大多数情况下,我认为在数据库中存储文件上传等数据并不是最佳做法。您应该考虑将文件保存在磁盘上,并将其文件名存储在数据库中。在数据库中存储高达2GB的文件会给MySQL服务器带来不必要的负担。