簡體   English   中英

使用php從mysql下載blob文件時為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM