2011-07-08 6 views
4

私はユーザーに画像ギャラリーを提出したいと考えています。私はwwwルートの上にファイルを保存するアップロードスクリプトを書いています。私はページヘッダーを指定してからreadfileを使ってファイルを提供できることを知っていますが、他の情報とともに表示されるテーブル内に画像を投げる予定です。ヘッダー/ readfileが最適なソリューションだとは思わないでしょう。私はシンボリックリンクを考えているが、わからない。1ページ内でwwwルートの上に存在する複数のイメージを扱うにはどうすればよいですか?

これを達成する最適な方法は何ですか?

+0

を、あなたはドキュメントルートの上にそれらを保つことによって得られるセキュリティの多くを捨てます。 –

答えて

4

getimage.phpのようなスクリプトが必要です。このスクリプトはイメージヘッダーとエコーをその内容から送ります。あなたのHTMLでは、それをあなたのHTMLの<img src=''>として利用するだけです。 目的がgetimage.phpの場合は、画像を検索して出力します。ブラウザに送信されるHTMLを生成するために使用するPHPとは別のものです。

さらに、ユーザーに有効なセッションがあり、画像を表示する権限があるかどうかを確認することができます(getimage.php)。そうでない場合は、何らかのアクセス拒否イメージを送信します。 getimage.php

内容は、小型でシンプルです:あなたのHTMLで

// Check user permissions if necessary... 

// Retrieve your image from $_GET['imgId'] however appropriate to your file structure 
// Whatever is necessary to determine the image file path from the imgId parameter. 

// Output the image. 
$img = file_get_contents("/path/to/image.jpg"); 
header("Content-type: image/jpeg"); 
echo($img); 
exit(); 

<!-- as many as you need --> 
<img src='getimage.php?imgId=12345' /> 
<img src='getimage.php?imgId=23456' /> 
<img src='getimage.php?imgId=34567' /> 

それは、その後、画像へのパスとしてgetimage.php?imgId=12345呼び出すために、ブラウザの仕事になります。ブラウザは、Webアクセス可能なディレクトリのイメージではなく、PHPスクリプトを呼び出すことを知らない。

0

スクリプトがUnixサーバ上で実行されている場合、WebルートのWebルート以外のディレクトリにリンクするシンボリックリンクをWebルートに作成しようとする場合があります。

ln -s /webroot/pictures /outside-of-webroot/uploads 

Apacheサーバーを使用している場合は、mod_aliasもご覧ください。 mod_aliasを使用し、.htaccessを使って設定する際にいくつかの問題があると聞いてきました。残念ながら私はmod_aliasに関する経験は全くありません。

0

いつもうまくいくのは、自分の画像を自分のmysql dbに直接アップロードさせることです。 PHPはbase64にエンコードしてblobに格納します。その後、イメージを取得して表示するためにマイケルが言ったことと同様のことをします。私は2008年に取り組んでいたプロジェクトのコードをいくつか含めました。古いコードなので使いたいメソッドなら、正確にはコピーしません。

これはアップロードしてDBに保存するPHPです。明らかにあなたの情報を交換し、あなた自身のDBに接続してください。その後

<?php 
// image.php      
// By Tyler Biscoe    
// 09 Mar 2008     
// File used to display pictures 
include("connect.php"); 

$imgid = $_GET["id"]; 

$result = mysql_query("SELECT * FROM images WHERE imgid=" . $imgid . ""); 

$image = mysql_fetch_array($result); 
echo base64_decode($image["sixfourdata"]); 
echo $image["sixfourdata"]; 

?> 

<?php 
include("auth.php"); 
// uploadimg.php    
// By Tyler Biscoe    
// 09 Mar 2008     
// Test file for image uploads 
include("connect.php"); 
include("include/header.php"); 
$max_file_size = 786432; 
$max_kb = $max_file_size/1024; 

if($_POST["imgsubmit"]) 
{ 
if($_FILES["file"]["size"] > $max_file_size) 
    { 
     $error = "Error: File size must be under ". $max_kb . " kb."; 
    } 

if (!($_FILES["file"]["type"] == "image/gif") && !($_FILES["file"]["type"] == "image/jpeg") && !($_FILES["file"]["type"] == "image/pjpeg")) 
    { 
     $error .= "Error: Invalid file type. Use gif or jpg files only."; 

    } 

if(!$error) 
    { 
     echo "<div id='alertBox'> Image has been successfully uploaded! </div>"; 
     $handle = fopen($_FILES["file"]["tmp_name"],'r'); 
     $file_content = fread($handle,$_FILES["file"]["size"]); 
     fclose($handle); 
     $encoded = chunk_split(base64_encode($file_content)); 
     $id = $_POST["userid"]; 
     echo $_FILES["file"]["tmp_name"]; 
     $default_exist_sql = "SELECT * FROM members WHERE id='".$id."'"; 
     $default_result = mysql_query($default_exist_sql); 
     $results = mysql_fetch_array($default_result); 
     if(!$results["default_image"]) 
     { 
      $insert_sql = "UPDATE members SET default_image = '$encoded' WHERE id='". $id ."'"; 
      mysql_query($insert_sql); 

     } 

     $sql = "INSERT INTO images (userid, sixfourdata) VALUES ('$id','$encoded')"; 
     mysql_query($sql); 
    } 
    else 
    { 
     echo "<div id='alertBox'>". $error . "</div>"; 
    } 
} 
?> 
<br /> 
<font class="heading"> Upload images </font> 
<br /><br /> 

    <form enctype = "multipart/form-data" action = "<?php $_SERVER['PHP_SELF']; ?>" method =  "post" name = "uploadImage"> 
<input type = "hidden" name="userid" value = "<?php echo $_GET["userid"]; ?>" > 
<input id="stextBox" type="file" name="file" size="35"><br /> 
<input type="submit" name="imgsubmit" value="Upload"> 
</form> 
<?php include("include/footer.php"); ?> 

この次のファイルが表示さそれらをシンボリックリンクすることにより

<img src="image.php?id=your_img_id"> 
+1

私は何らかの理由で絶対に重要でない限り、データベースに画像を保存しません。エンコード、ストア、リトリーブ、デコードは長いプロセスであり、そこには非常に非効率なDBがいくつかあります。 – rockerest

+0

私はそれがアプリケーションに依存すると思います。私はこのスクリプト、またはそれの何らかの形を何年もかけて問題なく使用しました。私のテストでのbase64のデコード(08年以降の私の記憶には欠陥があるかもしれません)は名目上のものでした。また、ユーザが自分の画像ライブラリを持っているメンバーシップシステムの一部として使用されている場合、すでにDBに照会して、関連付けられている画像を確認することになります。 また、encodeとstoreはアップロード時にのみ行われることに注意してください。そして検索(とにかくやっている)とデコードは別々です。 とにかく、私はいつも教育を受けていますので、どこに間違っているのか教えてください! :) –

関連する問題