我有一个数据库存储我网站的所有pdf文件。该表包含library_item_id,filename(文件名),mime_type,文件大小,file_item(Blob)的列,我有一个名为download.php的php文件。该文件应该在用户单击链接时从数据库中下载正确的文件。但是当文件被下载并点击打开时我得到Adobe说它无法打开pdf。说它没有正确解码。这是我的download.php文件:
require_once("scripts/connection.php");
if(isset($_GET["id"])){
$fid = $_GET["id"];
}
else{
header("Location: literature.php");
}
$sql= "SELECT filename, mime_type, file_item FROM library_items WHERE library_item_id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $fid);
$stmt->execute();
$stmt->bind_result($filename, $mime, $file_item);
while($stmt->fetch()){
$file_name = $filename;
$mime_type = $mime;
$file = $file_item;
}
header("Content-length: ".strlen($file));
header("Content-type: $mime_type");
header("Content-disposition: download; filename=$file_name");
echo $file;
mysqli_close($conn);
我已经尝试了我能想到的一切,包括添加obj_flush()命令以及它仍然给我带来同样的错误。我在这方面做错了什么?
以下是将文件插入数据库的代码的编辑。
session_start();
$display = trim($_POST["file-display-name"]);
$company = trim($_POST["companies"]);
$lib_cat = trim($_POST["library-cats"]);
if(empty($display) || empty($company) || empty($lib_cat)){
$_SESSION["errormsg"] = "Required information is missing please fill out all required fields.";
header("Location: ../library.php");
}
else{
$file_name = $_FILES['library-file']['name'];
$tmp_name = $_FILES['library-file']['tmp_name'];
$file_size = $_FILES['library-file']['size'];
$file_type = $_FILES['library-file']['type'];
$fp = fopen($tmp_name, 'r');
$content = fread($fp, filesize($tmp_name));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc()){
$file_name = addslashes($file_name);
}
if(empty($content)){
$_SESSION["errormsg"] = "Required information is missing please fill out all required fields.";
header("Location: ../library.php");
}
else{
require_once("connection.php");
// Insert the logo into the companies photo table
$sql = "INSERT INTO library_items(filename, mime_type, file_size, file_item, display_name, company_id, library_category_id) VALUES(?,?,?,?,?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('sssssss', $file_name, $file_type, $file_size, $content, $display, $company, $lib_cat);
if(!$stmt->execute()){
$_SESSION["errormsg"] = "Failed to add library item: ".mysqli_error();
header("Location: ../library.php");
}
}
unset($_SESSION["errormsg"]);
$_SESSION["successmsg"] = "Library Item successfully added into the database.";
header("Location: ../library.php");
}
更新: 我现在有文件下载并尝试显示双击下载的文件打开。它告诉我有一个无效的colorSpace。据我所知,当文件上传到数据库时,这是一个问题。从我的上传文件中发布的是我没有正确做的事情吗?
答案 0 :(得分:1)
您需要进行以下更改。在插入文件中 而不是
$content = addslashes($content);
使用
$content = base64_encode($content);
因此,在下载时,请对其进行解码。
$file = base64_decode($file_item);
替换以下代码
header("Content-type: '".$mime_type."'");
header("Content-Disposition: inline; filename='".$file_name."'");
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
readfile($file);
带
header("Content-length: ".strlen($file));
header("Content-type: $mime_type");
header("Content-disposition: download; filename=$file_name");
echo $file;
答案 1 :(得分:0)
检查下载文件的大小是否正确(与数据库中的文件大小匹配)。如果是,则应调试将文件插入数据库的部分。如果不是 - 在将文件发送到浏览器之前检查是否有任何内容被打印出来 - 也许scripts/connection.php
打印出类似空行,错误消息或BOM的内容?
如果找不到,请尝试打开输出缓冲并在发送文件前调用ob_clean()
。
对不起我的英语,我希望这是可以理解的。