圧縮ファイルをPHPを通じて隣のサーバーにFTPしたら解凍出来ません
- 評価
- クリップ 0
- VIEW 2,218
(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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/07/29 22:39
ERROR 500: Internal Server Error.
になって転送そのものが出来ませんでした。
2018/07/30 06:36
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)) {
で解凍出来ました。
ありがとうございました。
深く御礼申し上げます。