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

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

ただいまの
回答率

90.33%

  • PHP

    21354questions

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

圧縮ファイルをPHPを通じて隣のサーバーにFTPしたら解凍出来ません

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 211

tajix_japan

score 68

(DBサーバー) 192.168.1.110
(WEBサーバー) 192.168.1.100
の2つのサーバーがあります。CentOS7です。

DBサーバーで作成したCSVファイル群(&一部PHPファイル)を圧縮したtar.gz(csv.tar.gz)ファイルを下記のPHPを通じてWEBサーバーにFTPしました。

その後、
tar xvfzP csv.tar.gz -C /home/example/public_html/
の形で解凍したところ、

home/home/example/csv/
home/home/example/csv/reprace1.php
tar: Skipping to next header
gzip: stdin: invalid compressed data--format violated
tar: Child returned status 1
tar: Error is not recoverable: exiting now

というエラーが出て解凍出来ません。

このFTP用PHPファイルを使用せず、普通にファイルをダウンロード&アップロードして
tar xvfzP csv.tar.gz -C /home/example/public_html/
をすると、解凍が可能です。

この送信用PHPファイルに問題があるようですが、問題個所を見つけられません。

ご教示いただきたくお願いいたします。

<?php
$ftp_server = '192.168.1.100';
$ftp_port = 21;
$ftp_user_name = 'example';
$ftp_user_pass = 'password';

// 元のサーバー の送付元のファイル場所
$ftp_send_file = '/home/example/public_html/put_server/csv.tar.gz';

// 送付先サーバー  の送付先のファイル場所
$ftp_remote_file = '/home/example/public_html/csv.tar.gz';

// FTPサーバへ接続する
$conn_id = ftp_connect($ftp_server, $ftp_port);
if($conn_id == false){
    echo "FTPサーバへの接続失敗"."\n";
    exit();
}

// ユーザー名とパスワードでログインする
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if($login_result == false){
    echo "FTPサーバへのログイン失敗"."\n";
    // 接続を閉じる
    ftp_close($conn_id);
    exit();
}

//パッシブモードに設定
ftp_pasv($conn_id, true);

// ファイルをアップロードする
if (ftp_put($conn_id, $ftp_remote_file, $ftp_send_file, FTP_ASCII)) {
    echo "UPLOAD 成功"."\n";
} else {
    echo "UPLOAD 失敗"."\n";
}

// 接続を閉じる
ftp_close($conn_id);

?>


CHERRYさんのご指摘にあわせ、ftp_putをftp_binaryに代替えしてみました。
下記のように修正しましたが、
HTTP request sent, awaiting response... 500 Internal Server Error
となります。

<?php
$ftp_server = '192.168.1.100';
$ftp_port = 21;
$ftp_user_name = 'example';
$ftp_user_pass = 'password';

// 元のサーバー の送付元のファイル場所
$ftp_send_file = '/home/example/public_html/put_server/csv.tar.gz';

// 送付先サーバー  の送付先のファイル場所
$ftp_remote_file = '/home/example/public_html/csv.tar.gz';

// FTPサーバへ接続する
$conn_id = ftp_connect($ftp_server, $ftp_port);
if($conn_id == false){
    echo "FTPサーバへの接続失敗"."\n";
    exit();
}

// ユーザー名とパスワードでログインする
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if($login_result == false){
    echo "FTPサーバへのログイン失敗"."\n";
    // 接続を閉じる
    ftp_close($conn_id);
    exit();
}

//パッシブモードに設定
ftp_pasv($conn_id, true);

// ファイルをアップロードする
if (ftp_binary($conn_id, $ftp_remote_file, $ftp_send_file, FTP_ASCII)) {
    echo "UPLOAD 成功"."\n";
} else {
    echo "UPLOAD 失敗"."\n";
}

// 接続を閉じる
ftp_close($conn_id);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

ftp_put()のモードをFTP_BINARYにしたら改善しませんか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/29 22:39

    ありがとうございます。
    ERROR 500: Internal Server Error.
    になって転送そのものが出来ませんでした。

    キャンセル

  • 2018/07/30 06:36

    500 エラーになったとすると php ファイルの編集ミスの可能性もあります。修正後のプログラムを質問に追記していただけないでしょうか?

    キャンセル

  • 2018/07/30 09:41

    有難うございます。修正ソースをアップいたしました。

    キャンセル

  • 2018/07/30 15:10

    まず公式ドキュメントを読みましょう。

    ftp_put
    https://secure.php.net/manual/ja/function.ftp-put.php

    自前で定義していなければftp_binary() というAPIはありません。

    ftp_put()にモードについても記述があります。

    mode
    転送モード。FTP_ASCII または FTP_BINARY のどちらかを指定する必要があります。

    FTP_ASCIIってなに?という点がキモです。
    FTPには転送モードというのがあって、ASCIIモードの場合テキストファイルの改行コードを
    送受信お互いの環境に合わせて自動調整するという加工が加わります。
    バイナリファイルをASCIIモードで送ると壊れます。
    そのためテキストファイルを送るのでなければ通常は使いません。

    キャンセル

  • 2018/07/30 21:16

    ありがとうございます。
    テキストファイルの圧縮 = もともとテキストだからASCIIモードと誤解しておりました。
    圧縮ファイルはバイナリーモードなのですね。勉強になりました。

    if (ftp_put($conn_id, $ftp_remote_file, $ftp_send_file, FTP_BINARY)) {
    で解凍出来ました。
    ありがとうございました。
    深く御礼申し上げます。

    キャンセル

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

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

同じタグがついた質問を見る

  • PHP

    21354questions

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