2016-09-07 76 views
2
<?php 
// Make sure an ID was passed 
include('include/function.php'); 
if(isset($_GET['id'])) { 
// Get the ID 
    $id = intval($_GET['id']); 

    // Make sure the ID is in fact a valid ID 
    if($id <= 0) { 
     die('The ID is invalid!'); 
    } 
    else { 
     // Connect to the database 
     $dbLink = new mysqli('localhost', 'root', 'jio', 'jio'); 
     if(mysqli_connect_errno()) { 
      die("MySQL connection failed: ". mysqli_connect_error()); 
     } 

     // Fetch the file information 
     $query = " 
      SELECT `id`,`date`,`expected_date`,`comname`,`type`,`name`,`path`,`mime`, `size`, `data`,`other_detail`,`remark`,`username` 
      FROM `depository` 
      WHERE `id` = {$id}"; 
     $result = $dbLink->query($query); 

     if($result) { 
      // Make sure the result is valid 
      if($result->num_rows == 1) { 
      // Get the row 
       $row = mysqli_fetch_assoc($result); 

       // Print headers 

       header("Content-Type: ". $row['mime']); 
       header("Content-Length: ". $row['size']); 
       header("Content-Disposition: attachment; filename=". $row['name']); 


      } 
      else { 
       echo 'Error! No image exists with that ID.'; 
      } 

      // Free the mysqli resources 
      mysqli_free_result($result); 
     } 
     else { 
      echo "Error! Query failed: <pre>{$dbLink->error}</pre>"; 
     } 
     mysqli_close($dbLink); 
    } 
} 
else { 
    echo 'Error! No ID was passed.'; 
} 
?> 

我试图从路径位置(doc根目录)下载文件,但得到空文件下载或损坏的文件下载。任何人都可以建议我在上面的代码中出错或使用其他任何东西。无法在Linux下使用php下载文件

+2

您正在发送标题,但您要在哪里发送文件的实际内容? – jeroen

+0

打印数据 echo $ row ['path']; –

+0

检查是否没有其他输出,如文件内容之前发送到输出缓冲区的警告或字符。这会弄乱事情并使文件损坏。 – jannej

回答

0

在发送标题之后,您需要读取文件内容并发送该数据 - 以下内容未经过测试,但是或多或少都是您需要执行的操作。您可能需要根据sql结果中$row['path']的内容调整$filepath变量。

if($result->num_rows == 1) { 
    $row = mysqli_fetch_assoc($result); 

    header("Content-Type: ". $row['mime']); 
    header("Content-Length: ". $row['size']); 
    header("Content-Disposition: attachment; filename=". $row['name']); 

    /* you need to actually read the file and send it */ 

    $filepath=$row['path'] . '/' . $row['name']; 
    if(!realpath($filepath)) exit('Filepath '.$filepath.' is incorrect'); 

    if($file = fopen($filepath, 'rb')) { 
     while(!feof($file) and (connection_status()==0)) { 
      print(fread($file, 1024*8)); 
      flush(); 
     } 
     fclose($file); 
    } 

} 
+0

已解决@RamRider –