2015-10-12 5 views
0

У меня есть база данных, которая хранит все мои pdf-файлы для веб-сайта. В таблице есть столбцы для library_item_id, имя файла (имя файла), mime_type, размер файла, file_item (Blob), и у меня есть файл php, называемый download.php. Предполагается, что этот файл загружает правильный файл из базы данных, когда пользователь нажимает на ссылку. Но когда файл загружается и нажимается, чтобы открыть, я получаю Adobe, говоря, что он не может открыть PDF. Говорить, что он неправильно декодирован. Вот мой download.php файл:PDF не загружается, когда файл называется

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"); 
    } 

UPDATE: теперь у меня есть загрузка файлов и пытаюсь отобразить один раз загруженный файл дважды щелкнуть, чтобы открыть. Это говорит мне, что есть недопустимое colorSpace. Из того, что я могу сказать, это проблема, когда файл загружается в базу данных. Из моего загруженного файла есть что-нибудь, что я не делаю правильно?

+0

Какова ваша структура таблицы? Кажется, что у вас неправильный тип для столбца file_item. –

+0

@Alex: вам нужна загрузка? –

+0

file_item - большой капля. На самом деле это содержимое файла. –

ответ

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; 
+0

Если я использую это, это не дает мне возможность загрузить PDF, но файл открывается, и буквально пустой прямоугольник, такой как pdf, создается, но ничего не добавлено к нему.:/ –

+0

Если я попытаюсь открыть его из файла, который загрузил его, он также сообщает мне, что он имеет недопустимое colorSpace? Я никогда раньше этого не видел. –

+0

Является ли проблема, когда я загружаю файл в базу данных? Из того, что я нашел в этой ошибке, является то, что он связан с неправильным сохранением файла, но я не вижу, где я поступил неправильно, загружая файл в базу данных. –

0

Проверьте правильность размера загруженного файла (соответствует размеру файла в базе данных). Если это так, вы должны отлаживать часть, в которую файл вставляется в базу данных. Если нет - проверьте, не распечатано ли что-либо перед отправкой файла в браузер - возможно, scripts/connection.php печатает что-то вроде пустой строки, сообщения об ошибке или спецификации? Если вы не можете найти его, попробуйте включить буферизацию вывода и вызовите ob_clean() перед отправкой файла.

Извините за мой английский, я надеюсь, что это понятно.

+0

Я смотрю на это, не должно быть ничего распечатано. Я также опубликую код вставки в качестве редактирования. –

+0

Извините, я был совершенно неправ. Вы не можете использовать readfile со строкой, так как это не файл. вместо этого используйте 'echo'. – kao3991

Смежные вопросы