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

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

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

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

PHP

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

Q&A

1回答

4536閲覧

ftpでcsvファイルをバイナリモードでアップロードする問題

annderber

総合スコア98

FTP

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

PHP

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

0グッド

1クリップ

投稿2018/04/17 02:30

編集2018/04/17 06:23

お世話になります。

現在、サーバ間でftpによるcsvアップロード処理を行っているのですが、
csv内の「テストサーバー」という文字列が、アップロードされたcsv側では「テストサ?」という文字列になっています。csv内にある他のフィールドの文字列は正常に表示されるのですが、上記部分だけ文字化け(文字が欠け)てアップロードされてしまいます。このときftpの転送モードはバイナリにしています。
また、この現象は毎回起こるのではなく、過去数件中1件だけしか起こっていません。
文字コードはサーバー、クライアントともにSJISです。

現状ローカルでcsvを出力した段階では文字化けは起こしていないようです。
そもそもこの現象自体再現性がないので、なんとも言えないのですが。。。

csvアップロード時、転送モードをバイナリにすることでこのような現象が発生する可能性はありますでしょうか。また単純にFTPでcsvファイルをアップロードするとき、文字列の一部が欠けるなどの現象はありえるでしょうか。

追記:
1.CSV書き出し(一部抜粋)

php

1  $f = fopen($file_path, "w"); 2 3 $row = ['フィールド1', 'フィールド2']; 4 5 //フィールドごとの最大文字数分を取得 6 $row[0] = mb_substr($row[0], 0, 10); 7 8  // 文字コードや特定も文字を変換 9 array_walk_recursive($row, function(&$val, $key) { 10 //エスケープ 11 $val = str_replace('"', '""', $val); 12      13    // CR or LF → CRLF 14 $val = convert_eol($val); 15 }); 16 17 // 文字コード変換、データは必ず1次元配列 18 mb_convert_variables('SJIS-win', 'UTF-8', $row); 19 20 // すべての項目をダブルクオートで囲んでファイルに書き出しをする 21 fwrite($f, '"'.implode('","',$row) . '"' . "\r\n");

2.ファイルアップロード
PHPのftp_nb_put関数でファイルをアップロードしています。転送モードはバイナリです。

3.環境
〇クライアント
PHP・・・5.6
文字コード・・・UTF-8

あまり詳細な処理を記述できないのですが、
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/04/17 02:37

詳細ではなく、端折ったものでもコード提示は難しいのでしょうか?
annderber

2018/04/17 02:43

本来であればコードを提示すべきだと思うのですが、現状難しいです。申し訳ありません。あまりに情報不足で回答しようがないというご意見が多ければクローズいたします。
unz.hori

2018/04/17 02:52

ちょっと回答のしようがありませんね。まぁ事故を防ぐという点でご提案。MD5ハッシュ値を転送元と転送先で比較して一致していない場合、syslogなどにエラーを吐くという仕組みを入れるなどの手を打っておくといいかもしれません。
annderber

2018/04/17 02:58

ありがとうございます。参考にさせていただきます。
showkit

2018/04/17 03:26

30年以上、FTP を使っていますが、そういう現象が発生したことはありません。FTP自体でなく別の要因があるかと思われますが・・・。
m.ts10806

2018/04/17 03:59

文字化けというより、何かしらの文字制限でカットされたという可能性も、なくはないですが、いずれにしてもコードもサンプルデータもない状態では回答は難しいですね。処理フローとか、使ってる機能・関数があるだけでも違うのですが。
m.ts10806

2018/04/17 04:00

再現性がないのであれば「レアケース」ということでそのときだけ対応というのでもいいと思います。レアケースにあまり労力を割きすぎるのもよくはありません。
annderber

2018/04/17 05:47 編集

処理の一部を追記いたしました。環境等については提示するのが難しいです。 よろしくお願します。
m.ts10806

2018/04/17 05:48

PHPの文字コード、PHPのバージョンの記載も難しいですか?
annderber

2018/04/17 05:53

mts10806さんPHP関連の情報追記しました。
m.ts10806

2018/04/17 05:53

ありがとうございます。
annderber

2018/04/17 05:56

showkitさん・・・私も別の要因があるのではないかと考えていますが、現状相手側の環境がよく分からないので、切り分けが出来ない感じです
退会済みユーザー

退会済みユーザー

2018/04/27 07:21 編集

次のようなコマンドで日本語入力の設定をご確認いただけますか? → php --ri mbstring
guest

回答1

0

以下の文字列をファイルにコピペしてFTPサーバーにアップロードするとどうなりますか?

テストサーバー1,テストサ-バ-2

ちなみに2列目は長音がU+FF0Dになっています。

投稿2018/04/17 03:45

hichon

総合スコア5737

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

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

annderber

2018/04/17 05:47

コメントありがとうございます。 上記の文字列でテストしたところ、文字化け等はありませんでした。 確かにダッシュ系の文字を入力すると一部文字化けして「?」になるものがあると思うのですが、 今回の件では「?」の後の文字列が消えてしまっているというのが気になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問