php图片上传到mysql

时间:2016-09-15 09:54:19

标签: php html

我有这个代码。我的目标是使用php将图像上传到mysql。这给出了错误:404。我一次又一次地检查了我的代码,但没有看错。 mysqli_connection有什么问题,我尝试上传其他内容并且工作正常,但对于图片我有问题,错误:404。任何人对这里的问题有什么想法? 注意:当前文件的名称是upload.php

<html>
<head>
  <meta charset="UTF-8">
  <title>Resim Yükleyiniz</title>                        //Upload and image
</head>

<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="resim" value="Resim Seçiniz"> <input type="submit" value="Yükle">                        //choose an image , upload
</form>
</body>

<?php
//getting mysqli connection
$con = mysqli_connect("mysql.hostinger.web.tr","*******-user","*****-password") or die(mysql_error());
mysqli_select_db($con,"********-database name") or die(mysql_error());

$ders = $_GET['ders'];

//getting file content
$dosya = $_FILES['resim']['tmp_name'];
if(isset($dosya)){
  $resim = addslashes(file_get_contents($_FILES['resim']['tmp_name']));

  //control of if the file is an image or not
  $resim_boyutu = getimagesize($_FILES['resim']['tmp_name']);                                         //This gives false if the $dosya is not an image
  if($resim_boyutu == false)
    echo "Lütfen resim türünden bir dosya seçiniz.";
  else {
    if(!mysqli_query($con,"INSERT INTO $ders VALUES ('','$resim')"))                  //uploading image into the table
      echo "Görüntü yüklenirken bir hata oluştu.";
    else
      echo "Görüntü yüklendi";
  }
}

else
  echo "Lütfen resim seçiniz.";

?>

</html>

2 个答案:

答案 0 :(得分:0)

使用getimagesize()exif_imagetype()

// integer - for example: IMAGETYPE_GIF, IMAGETYPE_JPEG etc.
$type   = exif_imagetype($_FILES['image']['tmp_name']);

$info   = getimagesize($_FILES['image']['tmp_name']);
$mime   = $info['mime']; // mime-type as string for ex. "image/jpeg" etc.
$width  = $info[0];      // width as integer for ex. 512
$height = $info[1];      // height as integer for ex. 384
$type   = $info[2];      // same as exif_imagetype

请注意exif_imagetypegetimagesize.检查文档要快得多。

答案 1 :(得分:0)

很多要解决的问题。 (我经常认为我应该注册Code Review而不是Stack Overflow)

  • 您的代码中的die语句中有旧的mysql_引用,它们永远不会给您有用的响应。而是替换为die(mysqli_error($con))

  • 强烈建议在使用mysqli_connect时使用状态数据库,而不是单独的方法调用。 Read the Manual

  • 在对$ _FILE数据执行操作之前,您确实应该检查文件上传错误代码。例如:if($_FILES['resim']['error'] == 0){ process upload }

  • 由于您显然使用的是非ascii语言,因此强烈建议您在accept-charset='utf-8'标记中使用<form>

  • 我建议您阅读saving filedata into MySQL,我也建议您不要这样做,它更好,更高效,更容易调试,只需将参考保存到数据库中的文件并将映像文件存储在服务器光盘上,而不是存储在数据库中的字段中。 Reference

  • 您需要非常小心(阅读:更改,紧急!)$_GET值不合格并直接插入您的SQL查询:INSERT INTO $ders这是 非常糟糕的主意 ,不应该这样做。至少应该使用Preg_replace正则表达式删除任何无效或控制字符,例如:

     $ders = preg_replace("/[a-z0-9_]/i","",$_GET['ders']); 
    
  • 您认为自己addslashes需要file_get_contents的原因是什么?我建议添加斜杠,而是使用以下内容转义数据值:

    $resim = mysqli_real_escape_string($con, 
             file_get_contents($_FILES['resim']['tmp_name']));
    
  • 更好的方法是使用MySQLi Prepared Statements并将其与面向对象的数据库编程相结合。 强烈推荐使用此方法

我无法为您提供任何输出调试/帮助,因为您尚未说明导致您在问题中报告的错误404的原因。添加此数据(编辑您的问题)并告诉我,然后我可以修改它。

附加:因为您显然使用的是非ascii字符集,所以我强烈建议您花一点时间并通过this Stack Overflow Q&A读取,因此您知道如何正确处理数据库字符编码。这可能会为您节省压力。从这个问题的角度来看,我不会认为这是一个问题。

我还建议使用mb_string PHP module来确保PHP正确处理多字节字符串。