0

これは正しい方法ではないと言う人もいると思いますが、アプリケーションを完成させる締め切りが迫っているため、今のところ、戻ってコードを変更して画像をディレクトリに保存することはできません。

それがクリアされた今

私が持っていた質問は、これを入力してデータベースに画像を挿入したことです。

(クラス セキュリティ コールは気にしないでください。データが有効かどうかを確認するだけです)

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = addslashes($content);

//code to add all this to database
}

変数 $content は画像であり、その取得はすべて追加スラッシュです。base64と呼ばれるものでそれを行うと誰かが言ったことを覚えていますが、それがどのように書かれていたかはほとんど思い出せません。

これは、データベースから画像を呼び出す方法です

すべてのクエリを除いて、これは画像を呼び出す主要部分です

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
header("Content-Disposition: attachment; filename=".$imgname);
print $row['img'];

私が抱えている問題は、代わりに画像が表示されていることです。URLは表示されているだけなので、この場合はこれしか表示されません

http://localhost/admin/school-catalog.php?page=gallery&id=4

ページを開いて、URLに正しいパラメータが設定された画像を表示するとき。


画像などを保存するために行われているクエリを見たい人のために、セクション全体をコピーしました

//save image to db
if(isset($_POST['btnupload'])) {

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = base64_encode($content);
}

$save = mysql_query("insert into tbl_schoolgallery(id,hash,img,imgtype,imgsize) values(null,'$school','$content','$imgtype','$imgsize')") or die(mysql_error());
header("Location: school-catalog.php?page=school_gallery");

}


//call image from db
$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());
while($row = mysql_fetch_assoc($query)) {

$imgtypeget = explode("/", $row['imgtype']);

$imgname = "img.".$imgtypeget[1];
$imgtype = $row['imgtype'];
$imgsize = $row['imgsize'];

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
print base64_decode($row['img']);

print $row['img'];
}
4

1 に答える 1

7

使い方addslashesが極端に間違っています。列が TEXT フィールドか BLOB フィールドかによって、Base64 または を使用する必要がありますmysql_real_escape_string

Base64 の使用はそれほど難しくありません。そのように使うこともできます。に置き換えaddslashesbase64_encode、画像を でエコーするだけbase64_decodeです。

さらに言えば、全体を書くための少し簡単な方法があります。

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = base64_encode($content);
}

そして、出力するには、本当にする必要があるだけです

header("Content-type: ".$imgtype);
echo base64_decode($img);

ただし、列が BLOB の場合は、次を直接使用できますmysql_real_escape_string

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = mysql_real_escape_string($content);
}

その後:

header("Content-type: ".$imgtype);
echo $img;

現在の症状から判断すると、画像がデータベースから保存および呼び出される方法に関連するバグもあると思います。挿入するクエリを作成するコードの部分を確認する必要があります。その部分の修正を手伝う前に、データベースから読んでください。


現在のコードはほとんど問題ないようです。いくつかの問題:

print base64_decode($row['img']);

print $row['img'];

おそらく、2 番目の行を取り除くつもりでした。また、echo代わりにprint;を使用する必要があります。誰もがそれを使用していますが、時々少し速くなる可能性がありprint、値を返す以外に実際には何の利点もありません:

echo base64_decode($row['img']);

$security->secure()ある種のサニタイズ機能のようです。ただ使うmysql_real_escape_string()- それはあなたが使うことになっているものです。例外$imgsize; intval()整数であることがわかっているので、その上で使用することをお勧めします。

ここもまた:

$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());

tbl_schoolgalleryその数行上のテーブルに名前を付けます。と思い$tbl == 'tbl_schoolgallery'ますが、一貫性を保つため$tblに、両方の場所または両方の場所で使用する必要がありますtbl_schoolgallery

whileまた、それを-に置き換えてifください。とにかく、コードが複数回ループすると問題が発生します。

于 2009-06-26T06:03:06.980 に答える