質問編集履歴

1 回避策の追加

anaprestoo

anaprestoo score 199

2016/06/20 17:17  投稿

PHPのfile_put_contents関数でPermission Denied
いつもお世話になっております。どうしてもわからないことがありますので質問いたします。
巨大なバイナリファイルをサーバーにアップロードする際に、クライアント側でファイルを分割し、サーバー側で分割したファイルを元に戻すという実装を行っているのですが、分割したファイルを元に戻す過程でPermission Deniedが発生します。
どうしてもわからないのは、最初や2回目の書き込み時にPermission Deniedが発生するのではなく、途中(7回目や50回目など、おそらくランダム)でPermission Deniedが発生することです。
```php
<?php
$tmp_path = $_FILES["part"]["tmp_name"];
$contents = file_get_contents($tmp_path);
$path = "temp.exe";
file_put_contents($path, $contents, FILE_APPEND);
```
`$_FILES["part"]`は分割したバイナリファイルです。`$path`には拡張子exeのファイル名が入ります。重要な点は、拡張子がexe以外の場合ではPermission Deniedが発生しないということです。次のようにすることで、Permission Deniedは発生しません。
```php
<?php
$tmp_path = $_FILES["part"]["tmp_name"];
$contents = file_get_contents($tmp_path);
$path = "temp";
file_put_contents($path, $contents, FILE_APPEND);
```
なぜ拡張子をexeにすると、途中でPermission Deniedが発生してしまうのでしょうか。質問文を書いている最中に問題の回避策(拡張子をつけない)を見つけることはできましたが、拡張子exeでPermission Deniedが発生する理由がわかりませんので、どなたかこの疑問を解消してくれないでしょうか。よろしくお願いいたします。
なぜ拡張子をexeにすると、途中でPermission Deniedが発生してしまうのでしょうか。質問文を書いている最中に問題の回避策(拡張子をつけないor拡張子をexe以外にする)を見つけることはできましたが、拡張子exeでPermission Deniedが発生する理由がわかりませんので、どなたかこの疑問を解消してくれないでしょうか。よろしくお願いいたします。
<環境>
・Windows 10に今現在の最新版であるXAMPP v5.6.21をインストールしている。
  • PHP

    37366 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る