web-dev-qa-db-ja.com

サーバーのルートディレクトリの前/外にあるファイルにアクセスしますか?

私は、販売後の顧客サービス起業のためにイントラネットを作っています。従業員はimgファイルをイントラネットのサーバーにアップロードできる必要があり、私はそれらをBEFORE www(ウェブサイトのルートディレクトリ)のディレクトリに保存する必要があります。

Phpを使用してこれを行うのは非常に簡単ですが、アップロード後にこれらのimgをWebサイトに含める方法は?私はこのコードを試しました

<img src="../img/img.png"/>

サーバーのwwwディレクトリの外にあるとファイルを送信できないため、これは機能しません...

それを行う適切な方法はありますか?

現在のツリービュー:

server root directory
           |www
               |(all server files)
           |img
               |(all img files)

(サーバーのindex.phpはwwwにあり、ファイルはimgにあります)

11
Weacked

Webディレクトリ外のファイルには直接アクセスできません。あなたの質問には、タグPHP=も含まれています。

あなたができることは次のとおりです:

Wwwディレクトリ内に、次のような内容の「image.php」ファイルを作成します。

<?php
  header('Content-Type: image/png');
  readfile("../img/" . $_GET['img']);
?>

そしてあなたの画像を

<img src="image.php?img=myimage.png" />

PHPファイルはそれほど単純であってはなりません:)複数の画像形式に対処し(そしてそれらに正しいヘッダーを提供)、悪意のあるファイルパス/インクルージョンをチェックする必要がある場合があることに注意してください(入力を検証/サニタイズせずに$ _GETを使用したくない)、追加のキャッシュなどなど.

しかし、これはあなたがあなたの問題をどのように対象とすることができるかについてあなたに考えを与えるべきです。

18
GeneSys

それは、何をどのように達成しようとしているかに依存します。 「シンプルな」htmlコマンドを使用すると、ご存じのとおりです。 wwwルート以外のディレクトリには移動できません。 (例:C上のxamppアプリケーションの場合、ほとんどの場合c:\ xampp\htdocsです)。

サーバーサイドコマンドを使用して達成したいことを達成できる場合は、phpを使用して、PHP経由で適切なファイルを読み取ることで回避策を実行できます。たとえば、ファイルの名前が「myimg.gif」で、「c:\ pics」にある場合

<img SRC="data:image/gif;base64,<?php echo base64_encode(file_get_contents("c:\pics\myimg.gif"));?>">

これで、ファイルの内容を読み取り、imgタグに直接書き込みます。 image/gifを本当に必要なものに変更する必要があることに注意してください。

7
Thomas

ルートディレクトリ(wwwまたはpublic_html)の外/上にあるファイルに直接アクセスすることはできません。

Apacheサーバー構成で仮想ディレクトリを作成できます。詳細については、Googleの「Apache仮想ディレクトリ」。

仮想ディレクトリの構成例:

<IfModule alias_module>
  Alias /uploaded_images/ "/home/someuser/somewhere"
  <Directory "/home/someuser/somewhere">
    Allow from all
  </Directory>
</IfModule>

uploaded_imagesディレクトリは、wwwディレクトリの通常のディレクトリと同様に、Webから利用できます。そこから別の場所にファイルをコピーできます(一種のバッファリング)。

Apacheで何も変更せずにphpレベルからFTPでそのファイルを開いたりコピーしたりすることもできますが、これは非常に遅くなる可能性があります(Apache構成を制御できない場合にのみ使用してください。仮想ディレクトリの方がはるかに優れています)。

php.net:FTP

5
Kamil

仮想ディレクトリの作成に関する@kamilの考えに同意します。ただし、phpルートを使用する場合は、WWWの前のディレクトリにある画像を開いてwww/imagesフォルダーにコピーするコードをいくつか作成しました。

<?php 
$imagepath = "../images/";
define('IMGPATH', realpath($imagepath).DIRECTORY_SEPARATOR);
$cachewwwimg = "images/";
$imagename = 'image.jpg';
copy(IMGPATH.$imagename, $cachewwwimg.$imagename)
?>

<img src="<?php echo $cacheimg.$imagename;?>"/>
1
Jefri P.