PHPでFTPを使用してファイルのアップロードをする

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,251

sstaishou

score 40

PHPを使用してファイルをアップロードします。
まずAサーバーにフォームを設置しそこからBサーバーにファイルを保存するようにします。
以下、問題のプログラムです。

index.html

<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>test</title>
</head>
<body>
<form method="post" action="./up.php" enctype="multipart/form-data">
ファイル:<input type="file" name="up_file"><br>
<input type="submit" value="upload">
</form>
</body>
</html>


up.php

<?php
//
function FTP_Upload($ftp_server,$ftp_user_name,$ftp_user_pw,$remote_file,$local_file,$mode){
    //FTPサーバーに接続
    $conn_id = @ftp_connect($ftp_server);

    //ユーザ名とパスワードでログイン
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pw);

    //接続確認
    if ((!$conn_id) || (!$login_result)) {
        return die("FTP接続失敗!");
    } else {
        echo "ユーザー $ftp_user_name として、 $ftp_server に接続しました<br>\n";
    }

    //ローカルファイルをアップロード
    $upload = @ftp_put($conn_id, $remote_file, $local_file, $mode);
    // アップロード状況を確認する
    if (!$upload) {
        return die("アップロード失敗!");
    } else {
        echo "$local_file を $remote_file  へ アップロードしました<br>\n";
    }
    //FTP接続終了
    ftp_close($conn_id);
    return true;
}

//FTPサーバー名
$ftp_server="FTPサーバー名";
//ユーザー名
$ftp_user_name="ユーザー名";
//パスワード
$ftp_user_pw="パスワード";
//アップロード先のリモートファイルのパス
$remote_file="./";
//アップロードするローカルファイルのパス
$local_file= $_FILES['up_file']['tmp_name'];
//転送モード
$mode=FTP_ASCII;

FTP_Upload($ftp_server,$ftp_user_name,$ftp_user_pw,$remote_file,$local_file,$mode);
?>

プログラムはあるサイトに記載してあったものです。
FTPのアクセスはできましたがその後のアップロードができません。
まだPHPの知識は浅いです。
浅いからと言って丸投げしようと考えている訳ではありません。

わからないところ・問題であろうコードは

//アップロード先のリモートファイルのパス
$remote_file="./";
//アップロードするローカルファイルのパス
$local_file= $_FILES['up_file']['tmp_name'];


まず、ファイルを作成する関数はfopen()を使用します。
しかし、この行では使用されていません。
また、リモートパスは
public/htdocs/up/
などのように絶対パスで記述しなければならないでしょうか?
エラーログは何も書いてありませんでした。
まず第一にファイルのアップロードができないという問題を解決したいです。
どこが間違えているのか、fopenを使用しないのは正しいのか教えてください。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

ftp_putの第二引数$remote_fileはマニュルアルでも、ファイル名を含むのかどうかまで明記されていませんが、サンプルを見るとファイル名を含むようです。
http://php.net/manual/ja/function.ftp-put.php
なのでCodeLabさんの回答のように一時ファイルのファイル名を使うようにするか、決まったファイル名があるのならそれを指定すればよさそうです。

$remote_file = $_FILES['up_file']['name'];


パスについては、FTPでログインしたところのがホームディレクトリになるはずなので、そこからのパスになります。
ホームディレクトリ配下がpublic/htdocs/up/という構成であるなら、以下のいずれでもOKと思います。

$remote_file = 'public/htdocs/up/' . $_FILES['up_file']['name'];
$remote_file = './public/htdocs/up/' . $_FILES['up_file']['name'];
$remote_file = '/public/htdocs/up/' . $_FILES['up_file']['name'];


fopenについてはどこででてくるのでしょうか。
アップロードされた時点でファイルは$_FILESが示す場所に作成されていますので、あとはそれをFTPサーバー側に送るだけなので出番はないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

$remote_fileにはファイル名を入れるのでは?
アップ先がカレントディレクトリで、元のファイル名を用いるのであれば

$remote_file = $_FILES['up_file']['name'];


とすればよいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる