[英]blob files are empty when downloaded from mysql using php
我是 php 新手。 編寫了一些php代碼從mysql db上傳、查看和下載。 除了下載,一切都運行良好。 下載文件時,它已下載但打開時為空。 我直接從數據庫上傳和下載。 文件系統中沒有本地文件。 請幫忙。
上傳代碼:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload'])) {
if ($_FILES['upload_file1']['size'] <= 0) {
echo 'Hey, Please choose at least one file';
} else {
foreach ($_FILES as $key => $value) {
if (0 < $value['error']) {
echo 'Error during file upload ' . $value['error'];
} else if (!empty($value['name'])) {
$dbConn = mysqli_connect('localhost', 'root', '', 'files') or die('MySQL connect failed. ' . mysqli_connect_error());
$sql = "insert into files_data(name, type, size, content, saved_date) values('".$value['name']."', '".$value['type']."', '".filesize_formatted($value['size'])."', '".mysqli_escape_string($dbConn, file_get_contents($value['tmp_name']))."', '".date('Y-m-d H:i:s')."')";
$result = mysqli_query($dbConn, $sql) or die(mysqli_error($dbConn));
if($result) {
echo 'File successfully saved to database';
}
}
}
}
}
function filesize_formatted($size) {
$units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = $size > 0 ? floor(log($size, 1024)) : 0;
return number_format($size / pow(1024, $power), 2, '.', ',') . ' ' . $units[$power];
}
?>
SQL 代碼:
CREATE TABLE `files_data` (
`id` int unsigned COLLATE utf8mb4_unicode_ci NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`type` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
`size` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` blob NOT NULL,
`saved_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
獲取代碼:
<table class="table table-bordered">
<tr>
<th>PDF</th>
</tr>
<?php
include 'dbconfig.php';
$query = "SELECT * FROM files_data ORDER BY id DESC";
$result = mysqli_query($connect, $query);
$row = mysqli_num_rows($result) ;
for($i=0;$i<$row;$i++){
$arr = mysqli_fetch_assoc($result);
$fileName = $arr['name'];
$fileContent = $arr['content'];
?>
<tr>
<td>
<a href="download.php?file=<?php echo $arr['id']; ?>"><?php echo $fileName; ?></a>
</td>
</tr>
<?php } ?>
</table>
下載代碼:
<?php
include 'dbconfig.php';
mysqli_set_charset($connect,'utf-8');
$id = $_GET['file'];
$query = "SELECT * " ."FROM files_data WHERE id = '$id'";
$result = mysqli_query($connect,$query)
or die('Error, query failed');
list($id, $file, $type, $size,$content) = mysqli_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$file");
ob_clean();
flush();
echo $content;
mysqli_close($connection);
exit;
?>
數據庫表:
因為您在標頭中發送的大小只是文件內容的一部分,實際上是文件中的配置,這就是為什么您在下載后會收到損壞的文件。
<?php
include 'dbconfig.php';
mysqli_set_charset($connect,'utf-8');
$id = $_GET['file'];
$query = "SELECT * " ."FROM files_data WHERE id = '$id'";
$result = mysqli_query($connect,$query)
or die('Error, query failed');
list($id, $file, $type, $size,$content) = mysqli_fetch_array($result);
//header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$file");
ob_clean();
flush();
echo $content;
mysqli_close($connection);
exit;
?>
在我當地的環境中。 我在哪里設置此代碼。 我使用了 LongBlob。 這樣整個文件即使很大,也可以毫無問題地保存。
好的。 問題出在數據庫上。 我們需要將表字段“內容”類型設置為longblob ,否則文件會在上傳過程中損壞,因為它的大小較大並且不會完全上傳。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.