当我从我的数据库下载blob图像时,它的大小是1kb。当我打开.png文件本身时,图像没有出现。图像大小显示在我的MYSQL数据库表中。当名称和文件类型正确显示时,我无法弄清楚为什么它会从我的数据库中下载空文件。
我的表格列
对于名称/文件类型/大小,外翻似乎是正确的。
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();
?>
答案 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)