1

私のプロジェクトでは、いくつかのビデオ ファイルをルート フォルダーの外にあるフォルダーにアップロードする必要があります。move_uploaded_fileファイルをアップロードするために単純なphp関数を使用しています。以下のコードで試してみました。

$source  = $_FILES['Filedata']['tmp_name'];
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4'
move_uploaded_file($source,$targetFile);

しかし、それは機能していません。を通じてそれを行うことができますかmove_uploaded_file。そうでない場合は、これを行うためのより良いオプションを提案してください。

同様の質問を見たことがありますが、何も役に立ちません。だからどんな助けもいただければ幸いです..

4

6 に答える 6

3

あなたはchroot監獄にいないのですか?

もしそうなら、「絶対」パス名が間違った場所、つまり存在しない場所を指している可能性があります。

もしそうなら、刑務所内のどこかを指すようにパスを変更してください。

mount --bindこれを刑務所内のある場所に入れるディレクトリが必要になる場合があります。(刑務所から出るためのシンボリックリンクは機能しないことに注意してください。)

于 2012-05-20T20:35:16.473 に答える
2

おそらくこれは単純なアクセス許可の問題であり、解決するのは非常に簡単です。

  1. Apache が使用するユーザーを見つけます。これを行うには、httpd.conf ファイルを開き、次のようなものを探します。

    ユーザー apache
    グループ apache

  2. アップロードしようとしているフォルダーの所有権を変更します。

    chown -R apache.apache /usr/local/WowzaMediaServer-3.1.1/content/

  3. フォルダの権限を変更する

    chmod -R 775 /usr/local/WowzaMediaServer-3.1.1/content/

そして、それはそれであるべきです。

于 2012-05-23T13:02:04.167 に答える
2

この回答では、Apache を使用していると仮定します。

まず、アップロードされているファイルは大丈夫ですか?問題が発生する可能性のある理由の 1 つは、tmp ディレクトリが Web サーバーによって書き込み可能ではないか、読み取り可能ではないことです。これで問題ないと仮定すると、move_uploaded_file は正常に動作するはずです。

DOCUMENT_ROOT の横にフォルダーを作成します。これを「filestore」と呼びましょう。www-dataまたはapacheを実行しているユーザーが書き込み可能であることを確認してください。これで、ファイルをそのフォルダーに移動できるはずです。通常、それらは www-data:www-data によって所有されることに注意してください。または、サーバーが実行するように設定されているユーザーとグループに注意してください。「filestore」フォルダーを DOCUMENT_ROOT フォルダーの隣に置いた理由は、Web サーバーが DOCUMENT_ROOT までのファイル パスを確実に読み取れるようにするためです。そうしないと、パスの途中までのフォルダーが読み取り不能になる危険性があり、それによってあなたは死んでしまいます。たとえば、ターゲット フォルダとして /usr/local/media があり、/usr/local が Web サーバーによって読み取り可能 (および実行可能) でない場合、乾杯します。

これがすべて機能し、絶対にメディアを別の場所に置く必要がある場合は、「filestore」フォルダーへのパス全体が Web サーバーによって読み取り/実行可能である限り、どこにでも置くことができます。パス内の各ディレクトリを確認してください。

これらのアップロードされたファイルが Web 経由で他のユーザーによってダウンロードされている場合、ファイルを読み取るのは常に Web サーバーのユーザーになるため、「filestore」フォルダーには 700 の権限のみが必要です。他のユーザーがアクセスする必要がある場合は、通常、別のユーザーとして実行されている他のソフトウェアがそれらを使用する必要があるため、グループ メンバーがディレクトリを読み取り (および実行) できるように、アクセス許可を 750 にする必要がある場合があります。また、その別のユーザーを www-data グループに追加する必要があります。

ダウンロードの場合、いくつかの認証チェックを行った後にファイルをブラウザーにダンプする簡単なスクリプトを作成する必要があります。そうすれば、最初に認証を行わずに http 経由でメディアにアクセスすることを回避できます。これにより、サービスが違法なファイルにとって魅力的な場所になる可能性があります (ここでは、著作権侵害が最も懸念されていません)。

于 2012-05-19T18:00:09.243 に答える
1

これは、apacheユーザーにroot権限を与えるため、危険なアプローチです。したがって、注意して使用してください。

apacheユーザーをsudoersのリストに追加します。これにより、phpでrootとしてコマンドを実行できるようになりますsystem('sudo the_command')。次に、アップロードされたファイルを、apacheユーザーが記述できる一時的な場所に移動します(たとえば、ドキュメントルートに「tmp」ディレクトリを作成します)。次に、を使用system("sudo mv \"$source\" \"$destination\"");して一時ファイルを最終的な場所に移動します。

を実行すると、apacheユーザーを見つけることができます<?php echo exec('whoami'); ?>。次に、次のエントリをsudoersに追加しますthe-apache-user ALL=(ALL) NOPASSWD: ALLvisudosudoerエントリを追加するために使用します。

例:

$source  = $_FILES['Filedata']['tmp_name'];
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4'

$tempLocation = 'tmp/temp-file.mp4';

move_uploaded_file($source, $tempLocation);

system('sudo mv "' . $tempLocation . '" "' . $targetFile . '"');

編集:関連する質問-PHP exec()をrootとして実行する方法は?

于 2012-05-17T16:17:29.787 に答える
1

コードで常に問題に直面している場合は、サーバー ログを確認するか、エラー表示を簡単にオンにしてください。とはいえ、問題はupload_tmp_dir設定に関連している可能性があります。それについて何をphpinfo()伝えているかを確認するか、php.iniファイルを見てください。

于 2012-05-20T07:39:31.613 に答える
0

より良い解決策は、書き込み可能な場所 (つまり、webroot の下) にファイルを書き込み、それを書き込んだ場所へのメディア ディレクトリからシンボリック リンクを作成することです。

例えば:

  • Web ルートは /var/www/html です
  • /usr/local/WowzaMediaServer-3.1.1/content/ に置きたい
  • ディレクトリ /var/www/html/mediaserver/content/ を作成します
  • /var/www/html/mediaserver/content/ 777 にパーミッションを設定します (Apache が書き込みできるようにします)。
  • ファイルを /usr/local/WowzaMediaServer-3.1.1/content/ から /var/www/html/mediaserver/content/ にコピーします
  • /usr/local/WowzaMediaServer-3.1.1/content/ (「コンテンツ」ディレクトリのみ) を削除します。
  • /usr/local/WowzaMediaServer-3.1.1/content/ から /var/www/html/mediaserver/content/ へのシンボリックリンクを作成します

次に、読み取り/書き込みのアクセス許可があり、メディア サーバーもそうする必要があります。唯一の問題は、メディア サーバーがシンボリック リンクを読み取らないようにトレーニングされている場合ですが、十分に迅速に見つけることができます。

于 2012-05-19T02:42:36.617 に答える