当我从我的数据库

时间:2017-11-27 16:53:42

标签: php image download

当我从我的数据库下载blob图像时,它的大小是1kb。当我打开.png文件本身时,图像没有出现。图像大小显示在我的MYSQL数据库表中。当名称和文件类型正确显示时,我无法弄清楚为什么它会从我的数据库中下载空文件。

我的表格列

enter image description here

对于名称/文件类型/大小,外翻似乎是正确的。

enter image description here

upload.php的

<?php

require('config.php');
session_start();
if(isset($_POST['save']))
{
  $target_dir = "upload/img/";

  $filename = explode('.',$_FILES['image']['name']);
  $ext = $filename[1];
  $imgname = time().'.'.$ext;
  $target_file = $target_dir . $imgname ;

  $uploadOk = 1;
  $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
  // Check if image file is a actual image or fake image
  $check = getimagesize($_FILES["image"]["tmp_name"]);
  if($check !== false) {
    $text="File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    $text="File is not an image.";
    $uploadOk = 0;
  }
  // Check if file already exists
  if(file_exists($target_file)) {
    $text="Sorry, file already exists.";
    $uploadOk = 0;
  }
  // Check file size
  if($_FILES["image"]["size"] > 2000000) {
    $text="Sorry, your file is too large.";
    $uploadOk = 0;
  }
  // Allow certain file formats
  if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  && $imageFileType != "gif" && $imageFileType != "bmp" ) {
    echo "Sorry, only JPG, JPEG, PNG, GIF & BMP files are allowed.";
    $uploadOk = 0;
  }
  // Check if $uploadOk is set to 0 by an error
  if($uploadOk == 0) {
    $_SESSION["error"]=$text;
    header("Location:index.php?id=$id"); /* Redirect browser */
    exit();

  // if everything is ok, try to upload file
  }else{
    if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
      $path=$imgname;
      $finfo = new finfo();
        $array = explode('.', $_FILES['image']['name']);
        $extension = end($array);
        $filesize=$_FILES["image"]["size"];

      $conn->query("INSERT INTO images (image, name,filetype,size) VALUES ('$path','$path','$extension','$filesize')");
      $_SESSION["Success"]='Upload success';
      header("Location:index.php"); /* Redirect browser */
      exit();
    } else {
      $_SESSION["err"]=$text;
      header("Location:index.php"); /* Redirect browser */
      exit();
    }
  }
}

?>

的download.php

<?php
// Include config file
require_once 'config.php';


$id=$_GET["id"];
$sql = "select * from images where id=$id "; // 1
$res = $conn->query($sql);
while($row = $res->fetch_assoc())
{ 
    $image = $row['image'];
    $name = $row['name'];
    $type = $row['filetype'];
    $size =  $row['size'];
}

header("Content-type: ".$type);
header('Content-Disposition: attachment; filename="'.$name.'"');
header("Content-Transfer-Encoding: binary"); 
header('Expires: 0');
header('Pragma: no-cache');
header("Content-Length: ".$size);


echo $image;
exit();

?>

1 个答案:

答案 0 :(得分:1)

您的数据库屏幕截图显示您的图片blob仅为14字节。这只是文件的名称:

 $conn->query("INSERT INTO images (image, name,filetype,size) 
               VALUES ('$path','$path','$extension','$filesize')");

这是你的问题。您要将文件 name 作为文件 数据 插入。

只需将第一个$path实例替换为文件的内容

 $fileData = file_get_contents($target_file);
 $conn->query("INSERT INTO images (image, name,filetype,size) 
               VALUES ('$fileData','$path','$extension','$filesize')");

停止使用content-length header,使用PHP下载文件时会遇到问题。只是不要使用它,让浏览器接受服务器提供的数据。

问题是PHP在某些系统上读取文件大小的方式,并将该数据传递给header,但是由于磁盘空间的原因,标题接受的文件大小了一些(~5%)由于服务器在传输中自动压缩文件(gzip),所以由不同的程序读取或完全不同。

从Web服务器/浏览器的角度来看,blob数据是文件的所有意图和目的)

作为referenced by Shadow,您的内容类型标头也不正确。

 header("Content-type: ".$type); // wrong $type. 

应该是可识别的MIME类型,例如image / jpeg,因此$extension = end($array);应替换为mime_content_type()之类的内容:

 $extension = mime_content_type($target_file)