在PHP中上载文件时遇到问题

在PHP中上载文件时遇到问题,php,file-upload,Php,File Upload,我正在尝试使用php上传文件,它在1Mb之前工作得非常好,我已经看到缺少的一点是在php.ini上编辑这个值(我正在使用WAMP): post_max_size=8G上传_max_文件大小 =2G 正如你所看到的,我已经将它们更改为千兆字节,但它仍然不起作用,发生的事情是,我单击upload,它进入我的upload.php文件,只是挂在那里,不向数据库写入任何内容 我在我的HTML中有这个,但我已经评论过了: <!--input type="hidden" name="MAX_FILE_S

我正在尝试使用php上传文件,它在1Mb之前工作得非常好,我已经看到缺少的一点是在php.ini上编辑这个值(我正在使用WAMP):

post_max_size=8G上传_max_文件大小 =2G

正如你所看到的,我已经将它们更改为千兆字节,但它仍然不起作用,发生的事情是,我单击upload,它进入我的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");
} 
?>

您正在转义文件的内容。这将是图像无法显示的主要原因转义应该在将数据发送到远程目标时发生(使用
htmlentities()
将“文本”发送到浏览器,使用
mysql\u real\u escape\u string
将数据发送到mysql数据库)。您应该看看,如何正确实现文件上传

将文件上载到PHP时,请遵循以下规则:

  • 检查是否上载了文件:
    isset($\u FILES['userfile'])
  • 检查文件上载是否成功(
    $\u FILES['userfile']['error']==0
    )。如果不是,则显示相应的错误消息。看
  • 检查文件大小(最大大小):
    $\u文件['userfile']['size']<102400
    (将文件大小限制为100KB) (可选检查文件是否为空,这取决于您的应用程序)
  • 如果要使用文件名,请清除禁止的字符对其进行清理:
    $sanitizedFileName=preg_replace(“#[^a-z0-9_-].\35; i',”,$文件['userfile']['name')
  • 检查已清除名称的扩展名,无论是否允许:

    $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
    }
    
  • (可选)使用图像功能验证图像,并使用限制尺寸(宽度x高度)

  • 在数据库中使用或存储内容(
    file\u get\u contents($\u FILES['userfile']['tmp\u name'])
    )。 在数据库中存储数据时,不要忘记保存数据
  • 您正在转义文件的内容。这将是图像无法显示的主要原因转义应该在将数据发送到远程目标时发生(使用
    htmlentities()
    将“文本”发送到浏览器,使用
    mysql\u real\u escape\u string
    将数据发送到mysql数据库)。您应该看看,如何正确实现文件上传

    将文件上载到PHP时,请遵循以下规则:

  • 检查是否上载了文件:
    isset($\u FILES['userfile'])
  • 检查文件上载是否成功(
    $\u FILES['userfile']['error']==0
    )。如果不是,则显示相应的错误消息。看
  • 检查文件大小(最大大小):
    $\u文件['userfile']['size']<102400
    (将文件大小限制为100KB) (可选检查文件是否为空,这取决于您的应用程序)
  • 如果要使用文件名,请清除禁止的字符对其进行清理:
    $sanitizedFileName=preg_replace(“#[^a-z0-9_-].\35; i',”,$文件['userfile']['name')
  • 检查已清除名称的扩展名,无论是否允许:

    $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
    }
    
  • (可选)使用图像功能验证图像,并使用限制尺寸(宽度x高度)

  • 在数据库中使用或存储内容(
    file\u get\u contents($\u FILES['userfile']['tmp\u name'])
    )。 在数据库中存储数据时,不要忘记保存数据

  • 我猜想这与您的
    addslashes($content)
    语句有关。正如lekensteyn所说,这可能会导致二进制数据(如图像中的数据)损坏。不要使用
    addslashes()
    ,而是看看PHP的函数


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

    我猜这与您的
    addslashes($content)
    语句有关。正如lekensteyn所说,这可能会导致二进制数据(如图像中的数据)损坏。不要使用
    addslashes()
    ,而是看看PHP的函数


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

    为什么要尝试在文件内容中添加斜杠?这正是我被教导这样做的方式,不是吗?还有,为什么要在数据库中存储内容?因为其他用户稍后会使用这些内容,我想你的意思是,不只是通过FTP上传它们?@Luis看到了:你为什么试图在文件内容中添加斜杠?我就是这样被教导这样做的,不是吗?还有,你为什么要将内容存储在数据库中?因为其他用户稍后会使用它们,我猜你的意思是不是仅仅通过FTP上传它们?@Luis看到了:他添加了斜杠,因为他试图阻止SQL注入攻击。从来没有听说过的好心人会这样做。不用发誓。只是礼貌地纠正它们(但非常紧急)。我已经注意到这是一次试图为数据库转义数据的尝试。但这不是正确的方法。我现在更强调转义部分。我更喜欢从“你到底在做什么”开始的部分。你可以看到修订历史:-)他添加斜杠是因为他试图阻止SQL注入攻击。好心人