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

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

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

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

PHP

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

Q&A

解決済

1回答

1344閲覧

FTPを利用した<form>タグからのファイルアップロード

yukiko1025

総合スコア16

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

PHP

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

0グッド

0クリップ

投稿2019/03/23 11:06

編集2019/03/23 11:42

PHPを利用した画像ファイルの登録システムのメンテナンスをしています。
今までは登録画面 → 完了画面という流れだったものに、間に確認画面を追加するというものです。

登録画面から確認画面間の<form>タグによるファイルデータのPOSTができていることはvar_dumpで中身がNULLでないことを確認済です。
また、確認画面で選択画像をプレビューするために一時アップロード用のフォルダを用意しているのですが、
登録作業前にフォルダ内のクリア処理を実行させておりそちらも正常に動作しています。

そのため、FTPでのアクセスは確立されているようなのですが、どうにもファイルのアップロード処理が上手くいきません。
複数ファイルを受け取れる様にしているので、受け取った順に「tmpXX.jpg」(XXは連番)という名前にしてアップロードしたいです。

依頼元の環境の都合上、phpを動作させるアクセス用のサーバと画像ファイルをバックアップしておくサーバが別々になっています。
そのため、formからPOST後にFTPを利用して指定のサーバへファイルをアップロードする流れになっております。

初心者のため要領を得ていないところもあるかと思いますが、お力添えいただけますと幸いです。
また、ソース内の具体的な数値は伏せさせていただいているところもあります。

php

1//POSTされたファイルデータの処理 2 3// ファイルボタンで選択したデータの数をカウントする 4$imgData = count($_FILES['list1_IMGURL']['tmp_name']); 5for($countData = 0; $countData < $imgData; $countData++){ 6 7 // ファイル名の.移行(拡張子)を取得する 8 $fileName = substr(strrchr($_FILES['list1_IMGURL']['name'][$countData], '.'), 1); 9 10 // 拡張子が「jpg」「jpeg」ならば、登録用の配列に代入する 11 if($fileName == 'jpg' || $fileName == 'jpeg' ){ 12 13 // 画像データが選択されているか確認し、選択されていれば、配列に代入する。 14 if (is_uploaded_file($_FILES['list1_IMGURL']['tmp_name'][$countData])) { 15 16 $checkFile[] = file_get_contents($_FILES['list1_IMGURL']['tmp_name'][$countData]); 17 18 // ファイル数用のカウンタ 19 $fileCount++; 20 21 } 22 } 23}

php

1//FTPアップロードの処理 2 3 // FTP接続情報を設定する 4 $ftp = array( 5 'ftp_server' => '〇〇〇.〇〇〇.〇〇〇.〇〇', 6 'ftp_user_name' => '〇〇〇〇', 7 'ftp_user_pass' => '〇〇〇〇' 8 ); 9 // バックアップ先フォルダ名 10 $remoteFolder = '/〇〇/tmp/image/'; 11 12 // FTP接続を確立する 13 $connId = ftp_connect($ftp['ftp_server']); 14 15 // ユーザ名とパスワードでログインする 16 $loginResult = ftp_login($connId, $ftp['ftp_user_name'], $ftp['ftp_user_pass']); 17 18 // FTPサーバ上でバックアップ先フォルダに移動する 19 if(ftp_chdir($connId, $remoteFolder)){ 20 21 // カレントディレクトリの内容を得る 22 $deleteFile = ftp_nlist($connId, $remoteFolder); 23 24 //クリア処理 25 foreach($deleteFile as $dfile){ 26 27 ftp_delete($connId, $dfile); 28 } 29 30     <--- ここまでは動作確認済 ---> 31 32 //ファイルアップロード 33 $tmpCount = 0; 34 foreach($checkFile as $ufile){ 35 36 $tmpCount++; 37 $tmp_file = 'tmp'.$tmpCount.'.jpg'; 38 39 ftp_put($connId, $tmp_file, $ufile, FTP_BINARY); 40 } 41 } 42 43 // 接続を閉じる 44 ftp_close($conn_id);

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

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

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

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

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

m.ts10806

2019/03/23 11:18

なぜ、ftpが必要なのでしょうか? ファイルアップロードされる場所がphpが動いているサーバーとは別サーバーとか?
yukiko1025

2019/03/23 11:20

はい、そうなります。 依頼元の環境の都合上、phpを動作させるアクセス用のサーバと画像ファイルをバックアップしておくサーバが別々になっています。
m.ts10806

2019/03/23 11:26

そこを分かるように追記いただけますか? この内容だけだと別サーバーにする意味が今一つ分かりませんし
yukiko1025

2019/03/23 11:40

承知いたしました、質問本文に追記しておきます。
退会済みユーザー

退会済みユーザー

2019/03/23 11:56

1. ループ手前で $checkFile  の中身がはいってない可能性 2. ftp_put の第三パラはマニュアルと一致してるか このあたりを確認しよう
guest

回答1

0

ベストアンサー

下記2点確認してはどうでしょうか。

  1. ftp_pasv($connId, true) でパッシブモードにしてみる。(ログイン処理後に記述)
  2. $ufile が相対パスの場合、カレントディレクトリから見て正しいパスになっているか。

そもそも論としてFTPはセキュアじゃないので、SSH が使える環境なら scp で送信したほうが良いでしょう。

投稿2019/03/23 11:33

yhg

総合スコア2161

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

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

yukiko1025

2019/03/23 12:27

1.のパッシブモードの変更($loginResult ~の次行に追加)を行いましたが以前アップロードはされておりませんでした。 2.に関しましては、1つ目のソース(POSTされたファイルデータの処理)で$checkFileという配列に$_FILEのデータを入れ、 その配列をforeachで順に処理すればよいのではないかと考えたのですが、POSTされた$_FILEの情報をパスに設定するのではどうすればよいのでしょうか…。 foreachで使用する配列($checkFile)のキーを['list1_IMGURL']['tmp_name']など指定してみましたがアップロードできていないようでした。
yhg

2019/03/23 12:41

あーコードちゃんと読んでみたら分かりました。 $checkFile[] = file_get_contents($_FILES['list1_IMGURL']['tmp_name'][$countData]); これが原因です。わざわざファイルの内容取得する必要はなくて、 $checkFile[] = $_FILES['list1_IMGURL']['tmp_name'][$countData]; としてやれば良いと思います。
yukiko1025

2019/03/24 07:36

上記での対応をしたところ、正常にデータがアップロードされました。 ファイルの扱いについて理解が足りなかったようです、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問