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

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

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

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

Q&A

解決済

1回答

5677閲覧

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

tajix_japan

総合スコア132

PHP

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

0グッド

0クリップ

投稿2018/07/29 11:46

編集2018/07/30 00:41

(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

1<?php 2$ftp_server = '192.168.1.100'; 3$ftp_port = 21; 4$ftp_user_name = 'example'; 5$ftp_user_pass = 'password'; 6 7// 元のサーバー の送付元のファイル場所 8$ftp_send_file = '/home/example/public_html/put_server/csv.tar.gz'; 9 10// 送付先サーバー  の送付先のファイル場所 11$ftp_remote_file = '/home/example/public_html/csv.tar.gz'; 12 13// FTPサーバへ接続する 14$conn_id = ftp_connect($ftp_server, $ftp_port); 15if($conn_id == false){ 16 echo "FTPサーバへの接続失敗"."\n"; 17 exit(); 18} 19 20// ユーザー名とパスワードでログインする 21$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 22if($login_result == false){ 23 echo "FTPサーバへのログイン失敗"."\n"; 24 // 接続を閉じる 25 ftp_close($conn_id); 26 exit(); 27} 28 29//パッシブモードに設定 30ftp_pasv($conn_id, true); 31 32// ファイルをアップロードする 33if (ftp_put($conn_id, $ftp_remote_file, $ftp_send_file, FTP_ASCII)) { 34 echo "UPLOAD 成功"."\n"; 35} else { 36 echo "UPLOAD 失敗"."\n"; 37} 38 39// 接続を閉じる 40ftp_close($conn_id); 41 42?>

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

php

1 2<?php 3$ftp_server = '192.168.1.100'; 4$ftp_port = 21; 5$ftp_user_name = 'example'; 6$ftp_user_pass = 'password'; 7 8// 元のサーバー の送付元のファイル場所 9$ftp_send_file = '/home/example/public_html/put_server/csv.tar.gz'; 10 11// 送付先サーバー  の送付先のファイル場所 12$ftp_remote_file = '/home/example/public_html/csv.tar.gz'; 13 14// FTPサーバへ接続する 15$conn_id = ftp_connect($ftp_server, $ftp_port); 16if($conn_id == false){ 17 echo "FTPサーバへの接続失敗"."\n"; 18 exit(); 19} 20 21// ユーザー名とパスワードでログインする 22$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 23if($login_result == false){ 24 echo "FTPサーバへのログイン失敗"."\n"; 25 // 接続を閉じる 26 ftp_close($conn_id); 27 exit(); 28} 29 30//パッシブモードに設定 31ftp_pasv($conn_id, true); 32 33// ファイルをアップロードする 34if (ftp_binary($conn_id, $ftp_remote_file, $ftp_send_file, FTP_ASCII)) { 35 echo "UPLOAD 成功"."\n"; 36} else { 37 echo "UPLOAD 失敗"."\n"; 38} 39 40// 接続を閉じる 41ftp_close($conn_id); 42 43?> 44 45

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2018/07/29 12:59

daisuke7

総合スコア1563

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

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

tajix_japan

2018/07/29 13:39

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

2018/07/29 21:36

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

2018/07/30 00:41

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

2018/07/30 06: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モードで送ると壊れます。 そのためテキストファイルを送るのでなければ通常は使いません。
tajix_japan

2018/07/30 12:16

ありがとうございます。 テキストファイルの圧縮 = もともとテキストだからASCIIモードと誤解しておりました。 圧縮ファイルはバイナリーモードなのですね。勉強になりました。 if (ftp_put($conn_id, $ftp_remote_file, $ftp_send_file, FTP_BINARY)) { で解凍出来ました。 ありがとうございました。 深く御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問