2017-11-27 20 views
-1

データベースからブロブのイメージをダウンロードすると、サイズは1kbです。 .pngファイルを開くと画像が表示されません。 MYSQLデータベーステーブルに画像サイズが表示されます。名前とファイルタイプが正しく表示されている間に、データベースから空のファイルをダウンロードする理由を理解できませんでした。データベースからダウンロードすると、ブロブのサイズは1kbです

私のテーブルの列

enter image description here

Everthingは名/ファイルタイプ/サイズで正しいように思えます。データベースの

enter image description here

Upload.php

<?php 

require('config.php'); 
session_start(); 
if(isset($_POST['save'])) 
{ 
    $target_dir = "upload/img/"; 

    $filename = explode('.',$_FILES['image']['name']); 
    $ext = $filename[1]; 
    $imgname = time().'.'.$ext; 
    $target_file = $target_dir . $imgname ; 

    $uploadOk = 1; 
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
    // Check if image file is a actual image or fake image 
    $check = getimagesize($_FILES["image"]["tmp_name"]); 
    if($check !== false) { 
    $text="File is an image - " . $check["mime"] . "."; 
    $uploadOk = 1; 
    } else { 
    $text="File is not an image."; 
    $uploadOk = 0; 
    } 
    // Check if file already exists 
    if(file_exists($target_file)) { 
    $text="Sorry, file already exists."; 
    $uploadOk = 0; 
    } 
    // Check file size 
    if($_FILES["image"]["size"] > 2000000) { 
    $text="Sorry, your file is too large."; 
    $uploadOk = 0; 
    } 
    // Allow certain file formats 
    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
    && $imageFileType != "gif" && $imageFileType != "bmp") { 
    echo "Sorry, only JPG, JPEG, PNG, GIF & BMP files are allowed."; 
    $uploadOk = 0; 
    } 
    // Check if $uploadOk is set to 0 by an error 
    if($uploadOk == 0) { 
    $_SESSION["error"]=$text; 
    header("Location:index.php?id=$id"); /* Redirect browser */ 
    exit(); 

    // if everything is ok, try to upload file 
    }else{ 
    if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) { 
     $path=$imgname; 
     $finfo = new finfo(); 
     $array = explode('.', $_FILES['image']['name']); 
     $extension = end($array); 
     $filesize=$_FILES["image"]["size"]; 

     $conn->query("INSERT INTO images (image, name,filetype,size) VALUES ('$path','$path','$extension','$filesize')"); 
     $_SESSION["Success"]='Upload success'; 
     header("Location:index.php"); /* Redirect browser */ 
     exit(); 
    } else { 
     $_SESSION["err"]=$text; 
     header("Location:index.php"); /* Redirect browser */ 
     exit(); 
    } 
    } 
} 

?> 

Download.php

<?php 
// Include config file 
require_once 'config.php'; 


$id=$_GET["id"]; 
$sql = "select * from images where id=$id "; // 1 
$res = $conn->query($sql); 
while($row = $res->fetch_assoc()) 
{ 
    $image = $row['image']; 
    $name = $row['name']; 
    $type = $row['filetype']; 
    $size = $row['size']; 
} 

header("Content-type: ".$type); 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Expires: 0'); 
header('Pragma: no-cache'); 
header("Content-Length: ".$size); 


echo $image; 
exit(); 

?> 
+3

'$のPATH'は'基本的に時間(​​)です。 '' 。$ ext; 'これはパスです(したがって14バイト)なぜあなたはBLOBとしてそれを格納していますか? –

+3

'$ image'は基本的にファイルの名前です(' image'フィールドに保存します)。パスを使用してファイルを保存したファイルシステムからファイルを読み込み、その内容をクライアントに送信する必要があります。また、コンテンツの種類が正確でない場合は、拡張機能だけでなく適切なMIMEタイプを取得する必要があります。私はアップロードしたものを混ぜ合わせて、ダウンロードしたどこからでもPHPコードをダウンロードすると思います。アップロードコードは、ファイルシステムにデータを保存してそれにリンクするためのもので、ダウンロードは画像データをデータベースから取り出すためのものです。 – Shadow

答えて

1

あなたのスクリーンショットは、あなたのイメージブロブのみ14bytesであることを示しています。これは単にファイルの名前です。

$conn->query("INSERT INTO images (image, name,filetype,size) 
       VALUES ('$path','$path','$extension','$filesize')"); 

ここに問題があります。ファイルをファイルデータとして挿入しています。

単にファイルの内容$pathのあなたの最初のインスタンスを置き換えます。ファイルをダウンロードしてPHPを使用しているときheadercontent-lengthを使用して

$fileData = file_get_contents($target_file); 
$conn->query("INSERT INTO images (image, name,filetype,size) 
       VALUES ('$fileData','$path','$extension','$filesize')"); 

停止、それは問題をはらんでいます。それを使用せずに、サーバーが提供するデータをブラウザが受け入れるようにしてください。

問題はPHPが一部のシステムでファイルサイズを読み取り、そのデータをheaderに渡す方法ですが、ヘッダーはディスクスペースがどのように読み取られるかによって少し大きめ(〜5%)のファイルサイズを受け入れます。異なるプログラム、または完全に異なっているため、サーバーは転送中にファイルを自動圧縮します(gzip)。 referenced by Shadowとして

(Webサーバ/ブラウザの観点から、すべての意図や目的のためにblobデータがファイルある)


、あなたのコンテンツタイプヘッダも間違っています。

header("Content-type: ".$type); // wrong $type. 

は、このような画像/ JPEGとして認識MIMEタイプである必要があり、そう$extension = end($array);mime_content_type()ような何かに置き換える必要があります:

$extension = mime_content_type($target_file) 
+1

'-1'ポスターがそのマークを削除したか、それを保持すべき理由を説明してもらえますか?私は自分の答えを更新したので、もはや-1が必要ないと感じました。乾杯。 – Martin

+0

ありがとうございました。私はこれを試してみると、イメージ以外のすべてのものをデータベースにアップロードします。 – in2d

+1

あなたのコードには多くの問題があります。 [あなたのPHPエラーログを読む](https://stackoverflow.com/questions/8667190/get-php-error-log-from-php)にはうまくいくでしょう。 – Martin

関連する問題