質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2566閲覧

PHP:ストレージサーバからファイルサーバにコピーをしたい

kondokaisya

総合スコア25

PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/09/10 08:17

編集2018/09/10 08:39

PHPでAWSのストレージサーバからEC2のほうにアップロードされてあるファイルをコピーしたいのですがうまくいきません。
何かいい方法はあるでしょうか?

PHP

1//動画ファイル名 2$fname = "16d2TNNHDZ30BR"; 3//動画ファイルが入っているURL 4$umekomi = "http://s3.hoge.info/hoge/43493400/manage/mgcontents/mp4/16d2TNNHDZ30BR.mp4"; 5//本来は複数のファイルをコピーするのですが今回は上記のURLだけなのでmp4のほうにしか行かない。 6if(strstr($umekomi, '.mp4')) { 7 copy($umekomi,'./tmp/'.$fname.'.mp4'); 8//copy('http://s3.hoge.info/hoge/43493400/manage/mgcontents/mp4/16d2TNNHDZ30BR.mp4','/tmp/16d2TNNHDZ30BR.mp4'); 9//ストレージサーバからファイルサーバのtmpフォルダにファイルをコピー 10}elseif(strstr($umekomi, '.flv')){ 11 copy($umekomi,'./tmp/'.$fname.'.flv'); 12}

少し省略してますが、変数$umekomiに入っているURLからファイルサーバのtmpフォルダにコピーしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ズバリ回答というわけではありませんが…

ご確認いただければ幸いです。

投稿2018/09/10 08:39

ponzu1990

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kondokaisya

2018/09/10 08:52

回答ありがとうございます。 指摘されていた部分について、 ・allow_url_fopenは有効になっていますか? (onになっていました。) ・現在のディレクトリ、及び./tmpに書き込み権限はありますか? (パーミッションを777へ変更) ・ご指定のURL(s3)はpublicになっていますか? (なっていました。) この状態でコピーを実行しましたが、うまくいきませんでした。 以下の分が出ました。 copy(http://s3.hoge.info/hoge/43493400/contents/video/16d2TNNHDZ30BR.mp4) [function.copy]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/cross.gikai/htdocs/manage/alldl2.php on line 29
ponzu1990

2018/09/10 09:00

403が出るということはそのURLに直接アクセスできないということなので、サーバー(s3)側がユーザーエージェントや、リファラをチェックしていたり、そもそも認証が必要だったりする可能性が高い気がします。 (ユーザーエージェントは同じくphp.iniのuser_agentで指定ができます。) 取り急ぎまたわかりましたら追記させていただきます。
kondokaisya

2018/09/10 09:02

すみません。ありがとうございます。
ponzu1990

2018/09/10 09:28

ちなみに s3.hoge.infoはサンプルのURLですよね?(試しに叩いたら403でしたので)
ponzu1990

2018/09/10 09:34

https://techglimpse.com/fix-http-403-forbidden-php-copy/ 同じようにcopy()で403になっている方ですが、ページの最後のほうでuser agentを設定しています。 引用開始 ``` <?php $context = stream_context_create(array( 'http' => array( 'header' => array('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201'), ), )); $imageURL = "https://www.domain.net/images/commercial-wordPress-theme1.jpg"; copy($imageURL,'sample.jpg', $context); ?> ``` 引用終了。 これを参考に設定してみてはいかがでしょうか?
kondokaisya

2018/09/11 00:53

上のURLはサンプルですね。報告遅れてすみません。
ponzu1990

2018/09/11 02:04

ありがとうございます、ちなみにuser agentの設定をしてやってみたらどうなりますでしょうか?
kondokaisya

2018/09/11 02:15

うーん・・・うまくいきませんでした。自分もcopy()以外に何か方法がないか調べてみます。
ponzu1990

2018/09/12 01:01

無事解決できたようでおめでとうございます。お力になれなくて申し訳ないです…。
guest

0

自己解決

とりあえず、コピーできましたのでこちらに書き込みます。

PHP

1$i = 1; 2print_r($_POST); 3 4 5if(isset($_POST['check'])){ 6 foreach($_POST['check'] as $key => $fname ){ 7 $openflg = $_POST['openflg'][$key]; 8 echo $_POST['openflg'][$i]; 9 echo "openflg:".$openflg."<br>"; 10 if($openflg == 1){ 11 $url = $_POST['umekomi'][$key]; 12 $tname = $_POST['tname'][$key]; 13 echo "フォルダの検索:".$url."<br>"; 14 echo "タイトル".$tname."<br>"; 15 16 }elseif($openflg == 0){ 17 $change = $_POST['umekomi'][$key]; 18 $tname = $_POST['tname'][$key]; 19 if(strstr($change, '/contents/video')) { 20 $url = str_replace("/contents/video/","/manage/mgcontents/video/",$change); 21 }elseif(strstr($change, '/contents/mp4')){ 22 $url = str_replace("/contents/mp4/","/manage/mgcontents/mp4/",$change); 23 }elseif(strstr($change, '/contents/flv')){ 24 $url = str_replace("/contents/flv/","/manage/mgcontents/flv/",$change); 25 } 26 echo "フォルダの検索:".$url."<br>"; 27 echo "タイトル".$tname."<br>"; 28 } 29 30 $fileData = file_get_contents($url); 31 if(strstr($url, '.mp4')) { 32 file_put_contents('./tmp/'.$tname.'.mp4',$fileData); 33 }elseif(strstr($url, '.flv')){ 34 file_put_contents('./tmp/'.$tname.'.flv',$fileData); 35 } 36 $i++; 37 } 38}else{ 39 echo 'ダウンロードしたいファイルをチェックしてください。<br>'; 40 echo '<form name="frmbuck" action="alldl.php">'; 41 echo '<input type="submit" value="戻る">'; 42 echo '</form>'; 43}

コピー処理する側の方をcopy()ではなくfile_put_contents()を使うことでコピーができました。
ponzu1990さん、ここまで付き合ってくれてありがとうございました。

投稿2018/09/12 00:52

kondokaisya

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問